2013-06-04 30 views
4

来自实例documentation在一个函数中使用timeit模块与参数

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

同样的方法? 'print(timeit.timeit(“test(5)”,setup =“from __main__ import test”))'。如果你想使用一个参数,它是你在timeit代码之外定义的一个对象,你必须像其他任何东西一样导入它。 timeit字符串只是普通的Python代码,一切正常。 – BrenBarn

回答

6

错了,如果我你的问题是对的,你只是在寻找?

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

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() 
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()格式,这可能会导致它们失去各种精度和完整性。如果你使用这种方法,请检查你的输入!

相关问题