成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么 Python 代碼在函數中運行得更快?

開發 前端
如果想要進一步提高 python 函數代碼效率,不妨考慮一下使用局部變量而不是全局變量,另一種方法是盡可能使用內置函數和庫。Python 的內置函數是用 C 實現的,比 Python 快得多。

要理解為什么 Python 代碼在函數中運行得更快,我們需要首先了解 Python 是如何執行代碼的

我們知道,python 是一種解釋型語言,它會逐行讀取并執行代碼

當運行一個 python 程序的時候,首先將代碼編譯成字節碼(一種更接近機器碼的中間語言)然后 python 解釋器執行字節碼

圖片圖片

圖片圖片

由上所示,python 中的 dis 模塊將函數 hello_world 分解為字節碼

需要注意的是,python 解釋器是一個執行字節碼的虛擬機,默認的 python 解釋器是用 C 編寫的,即 CPython

還有其他的 python 解釋器如 Jython(用 Java 編寫),IronPython(用于 .net)和PyPy(用 Python 和 C 編寫)

為什么 python 代碼在函數中運行得更快

我們來編寫一個簡單的例子:定義一個函數 my_function,函數內部包含一個 for 循環

圖片圖片

編譯該函數的時候,字節碼可能如下所示

圖片圖片

這里的關鍵指令是 STORE_FAST ,用于存儲循環變量 i

現在我們把這個 for 循環放在 python 腳本的頂層(全局范圍內),然后再來看一下字節碼

圖片圖片

圖片圖片

可以看到關鍵指令變成了 STORE_NAME,而不是 STORE_FAST

字節碼 STORE_FAST比 STORE_NAME 快,因為在函數中,局部變量存儲在固定長度的數組中,而不是存儲在字典中。這個數組可以通過索引直接訪問,使得變量檢索非常快

基本上,它只是一個指向列表的指針,并增加了 PyObject 的引用計數,這兩個都是高效的操作

另一方面,全局變量存儲在一個字典。當訪問全局變量時,Python 必須執行哈希表查找,這涉及計算哈希值,然后檢索與之關聯的值

雖然經過優化,但仍然比基于索引的查找慢

基準測試驗證

我們知道在 Python 中,代碼執行的速度取決于代碼執行的位置——在函數中還是在全局作用域中

讓我們用一個簡單的基準測試的例子來比較一下

首先定義一個求階乘的函數

圖片圖片

然后在全局范圍內執行相同的代碼

圖片圖片

為了對這兩段代碼進行基準測試,我們可以在 Python 中使用 timeit 模塊,它提供了一種簡單的方法來對少量 Python 代碼進行計時

圖片圖片

可以看到,函數代碼的執行速度比全局作用域代碼要快

需要注意的是,這兩段代碼最好不要放在同一腳本中,要分開單獨運行

這是因為 benchmark() 函數在執行時間上增加了一些開銷,并且全局代碼在內部進行了優化

cProfile 分析

python 提供了一個  cProfile 內置模塊

讓我們用它來分析一個新例子:在局部和全局范圍內計算平方和

圖片圖片

上面的例子中,可以認為sum_of_squares_g() 函數是全局的,因為它使用了兩個全局變量, i 和 total

從性能分析結果中,可以看到函數代碼在執行時間方面比全局更有效

圖片圖片

如何優化 python 函數的性能

前面我們知道,Python 代碼在函數中運行往往比在全局范圍內運行要快得多

如果想要進一步提高 python 函數代碼效率,不妨考慮一下使用局部變量而不是全局變量

另一種方法是盡可能使用內置函數和庫。Python 的內置函數是用 C 實現的,比 Python 快得多

比如 NumPy 和 Pandas,也是用 C 或 C++ 實現的,它們比實現同樣功能的 Python 代碼速度更快

又比如同樣是實現數字求和的功能,python 內置的 sum 函數要比你自己編寫函數速度更快

責任編輯:武曉燕 來源: 咸魚運維雜談
相關推薦

2023-06-26 07:21:41

標題欄鼠標標題

2024-10-08 10:24:41

Python編程語言

2020-09-04 15:03:18

Python代碼語言

2021-12-14 12:10:41

ChromeWindows瀏覽器

2024-06-26 10:50:35

2012-09-11 09:16:52

Hadoop

2019-09-16 12:00:03

constC編程語言

2019-03-29 09:00:11

Windows 10PC模擬器

2020-11-09 10:01:29

Python乘法位運算

2021-01-13 10:51:08

PromissetTimeout(函數

2022-06-22 10:33:06

麻省理工大學PaShUnix shell

2023-09-18 23:42:27

C++編程

2021-02-14 13:38:17

Python開發函數

2020-07-22 07:55:12

Python開發函數

2024-09-11 08:38:02

JavaScriptC#語言編程

2023-09-14 15:48:53

排序測試

2021-04-19 09:57:57

uBlock OrigFirefox插件

2025-05-29 01:53:22

前端代碼開發

2021-10-04 09:25:28

Flutter圖像Web

2020-09-21 06:10:47

Python lambda匿名函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜精品久久久久久久99黑人 | 亚洲综合视频 | 欧美综合色 | 欧美久久国产 | 亚洲男人天堂2024 | 日韩在线免费播放 | 国产成人精品一区二区三区视频 | 91精品国产色综合久久不卡98 | 四虎永久免费地址 | 日本在线中文 | 亚洲精品在线免费播放 | 黄色一级视频 | 天天躁人人躁人人躁狂躁 | 国产精品一区久久久 | 在线综合视频 | 久久性色 | 国产高清久久 | 欧美久久免费观看 | 久久久久免费观看 | 日韩av在线不卡 | 久久久精品一区二区三区四季av | 久久99视频 | 亚洲不卡一 | 天堂网中文字幕在线观看 | 激情黄色在线观看 | 日韩精品成人 | 亚洲国产成人在线视频 | 精品国产一区三区 | 精品国产伦一区二区三区观看体验 | 日韩最新网站 | 亚洲色图综合网 | 91中文| 亚洲精品乱码 | 国产亚洲精品一区二区三区 | 欧美在线综合 | 亚洲人免费视频 | 久久大陆 | av免费在线播放 | 颜色网站在线观看 | 成人国产一区二区三区精品麻豆 | 麻豆一区|