在带有参数的函数中使用timeit模块

5

来自文档的示例:

def test():
    """Stupid test function"""
    L = []
    for i in range(100):
        L.append(i)

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))

但是如何调用带参数的函数呢,例如下面这个函数:

def test(some_object):
    """Stupid test function"""
    L = []
    for i in range(100):
        L.append(some_object)

同样的方式?print(timeit.timeit("test(5)", setup="from __main__ import test"))。如果你想使用一个在timeit代码之外定义的对象作为参数,你必须像导入其他东西一样导入它。timeit字符串只是普通的Python代码,一切都像平常一样运行。 - BrenBarn
3个回答

8
如果我理解您的问题正确,您只是在寻找那个吗?
anobj = 42 # where it can be whatever object
def test(foo):
    pass # do something with foo

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test(anobj)", setup="from __main__ import test, anobj"))

1
当答案就在问题中时,我非常喜欢它。:-p - zmo

2

以下是我在类似情况下使用的一种解决方案,只要您的参数不是巨大的矩阵或类似的东西。


假设我想测试一个名为foo(a,b,c)的函数,并使用我在主函数中初始化的值进行调用。我可以在不更改代码的情况下调用以下内容:

timeit.Timer('foo({},{},{})'.format(a,b,c), "from __main__ import foo")

如果您的参数是字符串,则必须重新引入值周围的引号:
timeit.Timer('foo("{}","{}","{}")'.format(a,b,c), "from __main__ import foo")

作为最后的警告,您必须考虑到您的参数将通过str()格式传递,这可能会导致它们失去各种精度和完整性。如果您使用此方法,请检查您的输入!

0

你想使用:

def main():
    import timeit
    print(timeit.timeit("test(some_object)")) # don't need to use the 'setup'

def test(my_object):
    lst = []
    for i in range(100):
        lst.append(my_object)

if __name__ == '__main__':
    main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接