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

时间:2013-06-04 18:11:21

标签: python timeit

来自documentation

的示例
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)

3 个答案:

答案 0 :(得分: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 :(得分:2)

这是一个在这种情况下对我有用的解决方案,只要你的论点不是巨大的矩阵或类似的东西。


让我们说我想测试一个函数foo(a,b,c),其中包含我在main函数中初始化的值。我可以在不改变代码的情况下调用以下内容,

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

如果您的参数是字符串,那么您必须重新引入值的引号:

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

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

答案 2 :(得分: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()