作為 Python 開發人員,我們通常先專注於如何讓程式碼正常運行,然後再擔心優化它。然而,在處理大規模應用程式或效能關鍵型程式碼時,最佳化變得至關重要。在這篇文章中,我們將介紹兩個可用於優化 Python 程式碼的強大工具:cProfile 模組和 PyPy 解釋器。
在這篇文章結束時,您將學到:
Python 以其易用性、可讀性和龐大的庫生態系統而聞名。但由於其解釋性質,它也比 C 或 Java 等其他語言慢。因此,了解如何優化 Python 程式碼對於效能敏感的應用程式(例如機器學習模型、即時系統或高頻交易系統)至關重要。
最佳化通常遵循以下步驟:
現在,讓我們開始分析您的程式碼。
cProfile 是一個用於效能分析的內建 Python 模組。它會追蹤程式碼中每個函數執行所需的時間,這可以幫助您識別導致速度變慢的函數或程式碼部分。
分析腳本最簡單的方法是從命令列執行 cProfile。例如,假設您有一個名為 my_script.py 的腳本:
python -m cProfile -s cumulative my_script.py
說明:
這將產生您的程式碼花費時間的詳細分類。
讓我們來看一個遞歸計算斐波那契數的基本 Python 腳本:
def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": print(fibonacci(30))
使用 cProfile 執行此腳本:
python -m cProfile -s cumulative fibonacci_script.py
執行 cProfile 後,您將看到以下內容:
ncalls tottime percall cumtime percall filename:lineno(function) 8320 0.050 0.000 0.124 0.000 fibonacci_script.py:3(fibonacci)
每列提供關鍵效能資料:
如果您的斐波那契函數花費太多時間,此輸出將告訴您最佳化工作的重點。
如果您只想分析特定部分,也可以在程式碼中以程式設計方式使用 cProfile。
import cProfile def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": cProfile.run('fibonacci(30)')
使用 cProfile 確定程式碼中的瓶頸後,就可以進行最佳化了。
範例:
# Before: Custom sum loop total = 0 for i in range(1000000): total += i # After: Using built-in sum total = sum(range(1000000))
範例:
# Before: Unnecessary repeated calculations for i in range(1000): print(len(my_list)) # len() is called 1000 times # After: Compute once and reuse list_len = len(my_list) for i in range(1000): print(list_len)
範例:
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2)
透過儲存每個遞歸呼叫的結果,大大加快了斐波那契計算的速度。
PyPy 是另一個 Python 解釋器,它使用即時 (JIT) 編譯來加速 Python 程式碼。 PyPy 將頻繁執行的程式碼路徑編譯為機器碼,使其比某些任務的標準 CPython 解譯器快得多。
You can install PyPy using a package manager like apt on Linux or brew on macOS:
# On Ubuntu sudo apt-get install pypy3 # On macOS (using Homebrew) brew install pypy3
Once PyPy is installed, you can run your script with it instead of CPython:
pypy3 my_script.py
Now, let’s combine these tools to fully optimize your Python code.
Let’s revisit our Fibonacci example and put everything together.
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": import cProfile cProfile.run('print(fibonacci(30))')
After optimizing the code with memoization, run it using PyPy for further performance improvements:
pypy3 fibonacci_script.py
By leveraging cProfile and PyPy, you can greatly optimize your Python code. Use cProfile to identify and address performance bottlenecks in your code. Then, use PyPy to further boost your program’s execution speed through JIT compilation.
In summary:
With this approach, you can make your Python programs run faster and more efficiently, especially for CPU-bound tasks.
Connect with me:
Github
Linkedin
以上是使用 cProfile 和 PyPy 模組優化 Python 程式碼:完整指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!