2

funcを使用して時間を計ろうとしているPython関数がありtimeitます。

funcf関数でもある引数 を取ります。私が書いているプログラムでは、これはラムダ関数ですが、定期的に定義された関数にすることもできます。重要なのは、この関数のソース コードが では利用できないfuncことです。利用できるのは、それへの参照だけです。

私がやろうとしていること:

def testTimingOfFunc(f):
    time = timeit.timeit("package.func(f)", "from src import package")

f定義されていないというエラーが表示されます。

他のすべては正しく機能しています。私が電話するとき:

testTimingOfFunc('lambda x:x**2')

関数を次のように変更します。

def testTimingOfFunc(f):
    time = timeit.timeit("package.func(" + str(f) + ")",
                         "from src import package")

すべてが正常に機能するため、timeit機能に関するすべてが問題ないことはわかっています。

ただし、それは機能しませんtestTimingOfFunc。文字列ではなく、関数参照が渡されます。

in にf引数として渡す方法についてのアイデアはありますか?functimeit

4

3 に答える 3

5

timeit は Python 呼び出し可能な値で呼び出すことができます: メソッドを次のように変更するだけです:

from src import package
import functools

def testTimingOfFunc(f):
    time = timeit.timeit(functools.partial(package.func, f))
于 2012-10-22T23:33:15.037 に答える
1

fの名前空間にへの参照を格納できますpackage。ただし、名前が競合しないように注意してください

def testTimingOfFunc(f):
    from src import package
    package.f = f
    time = timeit.timeit("package.func(package.f)", "from src import package")
于 2012-10-23T00:11:08.250 に答える
0

timeit.Timerパラメータの 1 つとして引数のない関数を受け入れます。

def tester(f):
    from src import package
    def wrapper():
        package.func(f)
    return wrapper

def foo(x):
    return x * 2

print(timeit.timeit(tester(foo)))
于 2012-10-22T23:34:47.920 に答える