Pythonは、データ処理や科学計算、Webアプリケーション開発など、さまざまな分野で広く使われているプログラミング言語です。Pythonでプログラムを書く場合、パフォーマンスの問題に直面することがあります。例えば、大量のデータを処理する場合や、高速なレスポンスが必要なWebアプリケーションを開発する場合などです。ここでは、Pythonでプログラムのパフォーマンスを計測する方法を紹介します。
timeモジュールを使う
Pythonには、timeモジュールがあります。これを使うことで、プログラムの実行時間を計測することができます。以下は、timeモジュールを使って、1から100000000までの数を足し算するプログラムの実行時間を計測する例です。
import time start = time.time() sum = 0 for i in range(1, 100000001): sum += i end = time.time() print("sum =", sum) print("time =", end - start)
このプログラムを実行すると、以下のような結果が表示されます。
sum = 5000000050000000 time = 7.905855178833008
cProfileを使う
Pythonには、cProfileというモジュールがあります。これを使うことで、プログラムの実行時間や関数の呼び出し回数など、詳細なパフォーマンス情報を取得することができます。以下は、cProfileを使って、Fibonacci数列を計算するプログラムのパフォーマンス情報を取得する例です。
import cProfile def fibonacci(n): if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2) cProfile.run('fibonacci(30)')
このプログラムを実行すると、以下のような結果が表示されます。
269253 function calls (4 primitive calls) in 0.181 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 217830 0.127 0.000 0.127 0.000 <ipython-input-2-4cd4ca4a77f4>:4(fibonacci) 1 0.000 0.000 0.181 0.181 <string>:1(<module>) 1 0.000 0.000 0.181 0.181 {built-in method builtins.exec} 1 0.054 0.054 0.181 0.181 {built-in method builtins.print}
この結果は、Fibonacci数列を計算するために217830回の関数呼び出しが行われ、そのうちの0.127秒が実際に計算に使われたことを示しています。
line_profilerを使う
Pythonには、line_profilerというモジュールがあります。これを使うことで、関数の各行の実行時間を計測することができます。以下は、line_profilerを使って、Fibonacci数列を計算するプログラムの各行の実行時間を計測する例です。
まず、line_profilerをインストールします。
pip install line_profiler
次に、以下のようなプログラムを作成します。
# fibonacci.py @profile def fibonacci(n): if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2) if __name__ == '__main__': fibonacci(30)
このプログラムを実行すると、以下のような結果が表示されます。
Line # Hits Time Per Hit % Time Line Contents ============================================================== 1 @profile 2 def fibonacci(n): 3 1 5 5.0 0.0 if n <= 1: 4 return n 5 else: 6 return fibonacci(n-1) + fibonacci(n-2) 7 8 1 2 2.0 96.2 if __name__ == '__main__': 9 1 75 75.0 3.8 fibonacci(30)
この結果は、fibonacci関数の各行の実行時間を示しています。例えば、7行目の呼び出しに0.0%の時間がかかっているのに対し、8行目の呼び出しには96.2%の時間がかかっていることがわかります。
timeitモジュールを使う
Pythonには、timeitというモジュールがあります。これを使うことで、繰り返し実行する処理の平均実行時間を計測することができます。以下は、timeitモジュールを使って、リストをソートするプログラムの実行時間を計測する例です。
import timeit my_list = [4, 6, 8, 2, 1, 9, 7, 5, 3] def sort_list(): my_list.sort() print(timeit.timeit(sort_list, number=100000))
このプログラムを実行すると、以下のような結果が表示されます。
0.4931665
まとめ
以上のように、Pythonには、標準ライブラリに含まれるモジュールを使って、プログラムのパフォーマンスを計測することができます。これらのモジュールを上手に活用して、Pythonプログラムのパフォーマンスチューニングに役立てましょう。これらのプログラムはPythonの基本的な文法とライブラリで実装することができます。Pythonの基礎学習には下記のようなサイトの利用が有効です。