読者です 読者をやめる 読者になる 読者になる

パフォーマンス計測のメモ

python

cProfileとpstats(ボトルネックの調査)

「実行経過のデータをファイルに出力 → データを読める形に出力」という手順で測定します。

実行経過のデータをファイルに出力するには、cProfileを使います。
#encoding:shift-jis
# import profile           # pure Pythonで書かれた profile モジュール
import cProfile as profile # 普通はCで書かれたcProfileを使うべき
# import hotshot           # hotshotはPython 3.xでは廃止された。

import spammodule
code_to_be_profiled = """
# 測定したいPythonコード
# profileには関数ではなく文字列を渡す
for i in xrange(10):
    spammodule.eggfunction('kfm.sff')
"""
profile.run(code_to_be_profiled, "mugen.stats")
データを読める形に出力するには、pstatsを使います。
#encoding:shift-jis
import pstats

stats = pstats.Stats("sffopen.stats") 
stats.strip_dirs()
stats.sort_stats('time', 'calls')
stats.print_stats(30)

timeit(コード片の時間測定)

timeitを使います。

#encoding:shift-jis
import timeit
from functools import partial

import spammodule

# timeit.timeitに、呼び出し可能な物を渡す。
# 文字列も渡せるが割愛

# 引数が無い関数はそのまま渡す。
t = timeit.timeit(
    spammodule.hamfunction,
    number=100
)
print("hamfunction :", t)

# 引数がある関数は、functools.partialを渡す。
t = timeit.timeit(
    partial(spammodule.eggfunction, "some-arg", some_kw_arg="value"),
    number=100
)
print("eggfunction :", t)

#timeit.Timerを使うことも出来る。
timer = timeit.Timer(spammodule.hamfunction)
print("hamfunction :", timer.timeit(number=100))