将lambda函数作为变量传递给timeit中的另一个函数

时间:2012-10-22 23:23:31

标签: python lambda arguments timeit

我有一个名为func的Python函数,我正在尝试使用timeit

func接受一个参数f,这也是一个函数。在我正在编写的程序中,它是一个lambda函数,但它也可以是一个定期定义的函数。重要的是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的工作原理;传入函数引用,而不是字符串。

关于如何将f作为参数传递给functimeit的任何想法?

3 个答案:

答案 0 :(得分:5)

可以使用python可调用值调用timeit:只需将方法更改为:

from src import package
import functools

def testTimingOfFunc(f):
    time = timeit.timeit(functools.partial(package.func, f))

答案 1 :(得分:1)

您可以在f的命名空间中存储package的引用。请注意,尽管

没有名称冲突
def testTimingOfFunc(f):
    from src import package
    package.f = f
    time = timeit.timeit("package.func(package.f)", "from src import package")

答案 2 :(得分:0)

timeit.Timer接受无参数函数作为其参数之一:

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)))