Pythonでプログラムのパフォーマンスを計測する方法

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の基礎学習には下記のようなサイトの利用が有効です。

click.linksynergy.com

click.linksynergy.com