日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-09-20 21:54:44 298觀看
導讀要理解為什么 Python 代碼在函數中運行得更快,我們需要首先了解 Python 是如何執行代碼的我們知道,python 是一種解釋型語言,它會逐行讀取并執行代碼當運行一個 python 程序的時候,首先將代碼編譯成字節碼(一種更接近機器

要理解為什么 Python 代碼在函數中運行得更快,我們需要首先了解 Python 是如何執行代碼的4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

我們知道,python 是一種解釋型語言,它會逐行讀取并執行代碼4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

當運行一個 python 程序的時候,首先將代碼編譯成字節碼(一種更接近機器碼的中間語言)然后 python 解釋器執行字節碼4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

由上所示,python 中的 dis 模塊將函數 hello_world 分解為字節碼4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

需要注意的是,python 解釋器是一個執行字節碼的虛擬機,默認的 python 解釋器是用 C 編寫的,即 CPython4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

還有其他的 python 解釋器如 Jython(用 Java 編寫),IronPython(用于 )和PyPy(用 Python 和 C 編寫)4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

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

4p928資訊網——每日最新資訊28at.com

我們來編寫一個簡單的例子:定義一個函數 my_function,函數內部包含一個 for 循環4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

編譯該函數的時候,字節碼可能如下所示4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

這里的關鍵指令是 STORE_FAST ,用于存儲循環變量 i 4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

現在我們把這個 for 循環放在 python 腳本的頂層(全局范圍內),然后再來看一下字節碼4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

可以看到關鍵指令變成了 STORE_NAME,而不是 STORE_FAST 4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

字節碼 STORE_FAST比 STORE_NAME 快,因為在函數中,局部變量存儲在固定長度的數組中,而不是存儲在字典中。這個數組可以通過索引直接訪問,使得變量檢索非常快4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

基本上,它只是一個指向列表的指針,并增加了 PyObject 的引用計數,這兩個都是高效的操作4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

另一方面,全局變量存儲在一個字典。當訪問全局變量時,Python 必須執行哈希表查找,這涉及計算哈希值,然后檢索與之關聯的值4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

雖然經過優化,但仍然比基于索引的查找慢4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

基準測試驗證

4p928資訊網——每日最新資訊28at.com

我們知道在 Python 中,代碼執行的速度取決于代碼執行的位置——在函數中還是在全局作用域中4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

讓我們用一個簡單的基準測試的例子來比較一下4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

首先定義一個求階乘的函數4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

然后在全局范圍內執行相同的代碼4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

為了對這兩段代碼進行基準測試,我們可以在 Python 中使用 timeit 模塊,它提供了一種簡單的方法來對少量 Python 代碼進行計時4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

可以看到,函數代碼的執行速度比全局作用域代碼要快4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

需要注意的是,這兩段代碼最好不要放在同一腳本中,要分開單獨運行4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

這是因為 benchmark() 函數在執行時間上增加了一些開銷,并且全局代碼在內部進行了優化4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

cProfile 分析4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

python 提供了一個  cProfile 內置模塊4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

讓我們用它來分析一個新例子:在局部和全局范圍內計算平方和4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

上面的例子中,可以認為sum_of_squares_g() 函數是全局的,因為它使用了兩個全局變量, i 和 total4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

從性能分析結果中,可以看到函數代碼在執行時間方面比全局更有效4p928資訊網——每日最新資訊28at.com

圖片圖片4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

如何優化 python 函數的性能

4p928資訊網——每日最新資訊28at.com

前面我們知道,Python 代碼在函數中運行往往比在全局范圍內運行要快得多4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

如果想要進一步提高 python 函數代碼效率,不妨考慮一下使用局部變量而不是全局變量4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

另一種方法是盡可能使用內置函數和庫。Python 的內置函數是用 C 實現的,比 Python 快得多4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

比如 NumPy 和 Pandas,也是用 C 或 C++ 實現的,它們比實現同樣功能的 Python 代碼速度更快4p928資訊網——每日最新資訊28at.com

4p928資訊網——每日最新資訊28at.com

又比如同樣是實現數字求和的功能,python 內置的 sum 函數要比你自己編寫函數速度更快4p928資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-10609-0.html為什么 Python 代碼在函數中運行得更快?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 使用二進制字面量在現代C++中的應用

下一篇: 數據組合利器:從入門到精通Python中的zip()函數應用

標簽:
  • 熱門焦點
  • 中興AX5400Pro+上手體驗:再升級 雙2.5G網口+USB 3.0這次全都有

    2021年11月的時候,中興先后發布了兩款路由器產品,中興AX5400和中興AX5400 Pro,從產品命名上就不難看出這是隸屬于同一系列的,但在外觀設計上這兩款產品可以說是完全沒一點關系
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發布結束的第一時間給大家帶來這款耳機的簡單分享。現在大家能見到最多的藍牙耳機
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(niudaocaijing)7月5日,企鵝FM發布官方公告稱由于業務調整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業務走向消亡。騰訊在長音頻領域還在摸索。為
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就“胡錫進炒股是否知道認真報道”展開討論。有
  • 小米公益基金會捐贈2500萬元馳援北京、河北暴雨救災

    8月2日消息,今日小米科技創始人雷軍在其微博上發布消息稱,小米公益基金會宣布捐贈2500萬元馳援北京、河北暴雨救災。攜手抗災,京冀安康!以下為公告原文
  • 蘋果140W USB-C充電器:采用氮化鎵技術

    據10 月 30 日 9to5 Mac 消息報道,當蘋果推出新的 MacBook Pro 2021 時,該公司還推出了新的 140W USB-C 充電器,附贈在 MacBook Pro 16 英寸機型的盒子里,也支
Top 主站蜘蛛池模板: 象州县| 博野县| 分宜县| 灌南县| 上思县| 思茅市| 平江县| 苍溪县| 衡南县| 灌阳县| 项城市| 论坛| 枝江市| 科技| 金阳县| 乐安县| 屏东市| 洪湖市| 米林县| 东乡县| 湟中县| 黄梅县| 会东县| 宁南县| 赫章县| 拉萨市| 淮南市| 梨树县| 古田县| 溧阳市| 土默特右旗| 乐业县| 南通市| 三江| 安西县| 高州市| 通化县| 腾冲县| 灵宝市| 健康| 新乡县|