Python 開発者として、私たちはコードの最適化について心配する前に、コードが機能することに重点を置くことがよくあります。ただし、大規模なアプリケーションやパフォーマンスが重要なコードを扱う場合は、最適化が重要になります。この投稿では、Python コードの最適化に使用できる 2 つの強力なツール、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 は、ジャストインタイム (JIT) コンパイルを使用して Python コードを高速化する代替 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 中国語 Web サイトの他の関連記事を参照してください。