Pythonメモ torinaブログ

このブログはDjangoとBootstrap4で作成されました
ソースコード

Python、timeitを使い関数の実行速度を計測

プログラミング関連 パフォーマンス timeitモジュール
約306日前 2016年5月25日0:27
標準ライブラリのtimeitモジュールを使い、関数の実行速度を量ります。

コマンドプロンプト等から実行もできますが、今回はモジュール内に書いてみようと思います。
シンプルな例は、以下のようになります。
import timeit
print(timeit.timeit("a=[x for x in range(100)]"))



setupには、最初に行うコードがかけます。「timeitスタート」といった表示などですね。
timeitはセットアップ文を1回だけ実行し、メイン文を指定回数実行します。関数オブジェクトや、文字列としてのコードが渡せます。
気をつけるのは、1億回と指定した場合はあくまで1億回実行した計測時間を図ることです。平均値ではありません。
import timeit
print(timeit.timeit("print('ie-i')", setup="print('timeitを始めます')"))


指定回数は、デフォルトで100万回実行します。
回数を指定する場合は、以下のようになります。
import timeit
print(timeit.timeit("print('ie-i')", setup="print('timeitを始めます')", number=100))




お試しです。処理速度の計測は実行環境、マシンスペック等に影響されますので、一つの参考情報として考えるとよいでしょう。
標準のCPython、Python3.4です。
def make_list():
    a = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
         "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
 
 
def make_tuple():
    a = ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
         "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z")

import timeit
print(timeit.timeit(make_list))
print(timeit.timeit(make_tuple))


もし、関数に引数などを渡したい場合は、関数オブジェクトではなく文字列のコードとして渡します。。
その場合は、setupにimport処理を行うか、文字列のコード自体にimport文を含めるとよいでしょう。
print(timeit.timeit("make_list(args)", setup="from __main__ import make_list"))


上のコードは、Python3.5からは以下のようにかけます。
print(timeit.timeit("make_list(args)", globals=globals() ))


今回のサンプルコードは、以下のような結果になりました。
タプルは変更ができない、辞書のキーにできる、といった特徴がありますがパフォーマンス面でも優位です。
C:\MyMercurial\test\testpython>python main.py
1.0016769690792888
0.2574356857095288


単純なループでのappendと、リスト内包表記です。
def list_loop():
    result = []
    for i in range(100):
        result.append(i)
 
 
def list_compre():
    result = [x for x in range(100)]
 
 
import timeit
print(timeit.timeit(list_loop))
print(timeit.timeit(list_compre))


言うまでもなく、リスト内包表記は早いですね。
25.811760822345214
11.772926837953296


コマンドラインから利用するには、以下の書式です。
python -m モジュール名...という形はよく使うので、覚えておきましょう。
python -m timeit [-n N] [-r N] [-u U] [-s S] [-t] [-c] [-h] [statement ...]


https://docs.python.jp/3/library/timeit.html