1

怠惰になり、計画どおりにパンアウトしないタイピングを減らすことができるように、timeitを使用して小さな関数を作成しました。

(関連する)コード:

def timing(function, retries=10000, formatSeconds=3, repeat=10):
    """Test how long a function takes to run. Defaults are set to run
    10 times of 10000 tries each. Will display time as 1 of 4 types.
    0 = Seconds, 1 = milliseconds, 2= microseconds and 3 = nanoseconds.
    Pass in paramaters as: (function, retries=10000,formatSeconds=3, repeat=10)"""
    t = timeit.Timer(lambda: function)
    result = t.repeat(repeat=repeat,number=retries)
    rlist = [i/retries for i in result]

正常に動作しますが、戻り続けます。

timeprofile.timing(find_boundaries(numpy.asarray(Image.open(
r'D:\Python\image\image4.jpg')),79))
    10 runs of 10000 cycles each: 
    Best time: 137.94764   Worst:158.16651  Avg: 143.25466 nanosecs/pass

さて、通訳からやったら:

import timeit
from timeit import Timer
t = timeit.Timer(lambda: (find_boundaries(numpy.asarray(Image.open(r'D:\Python\image\image4.jpg')),79)))
result = t.repeat(repeat=5,number=100)
result = [i/100 for i in result]

最終的には[0.007723014775432375, 0.007615270149786965, 0.0075242365377505395, 0.007420834966038683, 0.0074086862470653615]、または約8ミリ秒になります。

また、スクリプトでプロファイラーを実行すると、約8ミリ秒というほぼ同じ結果が得られます。

問題が何であるかはよくわかりませんが、関数の呼び出し方法と関係があると思います。デバッガーでデータを確認すると、lenが53の辞書として機能が表示され、各キーには1〜15個のタプルが含まれ、それぞれに2〜3桁の数字のペアが含まれています。

だから、誰かがそれがなぜそれをしているのかを知っていて、それを私に説明したいのであれば、そしてそれを修正する方法は素晴らしいでしょう!

4

1 に答える 1

3

はい、違いがあります。実行すると:

timeprofile.timing(find_boundaries(numpy.asarray(Image.open(
    r'D:\Python\image\image4.jpg')),79))

関数参照を渡していません。関数を呼び出しており、代わりにその呼び出しの結果を渡しています。staticresultあなたは代わりにタイミングを計っていsomefunction(with, arguments)ます。

ラムダを移動します。

timeprofile.timing(lambda: (find_boundaries(numpy.asarray(Image.open(
    r'D:\Python\image\image4.jpg')),79)))

timingこれは、関数からそれを削除し、代わりに関数をTimer()クラスに直接渡す必要があることを意味します。

t = timeit.Timer(function)
于 2013-02-05T20:05:10.913 に答える