python timeit模块重复功能

时间:2014-02-27 17:20:02

标签: python

我有四个名为numbers_string1()numbers_string2()numbers_string3()numbers_string4()的函数,我需要找出这些函数的执行时间。

from numstring import *
import time
def profile_clock():
    l=["numbers_string1","numbers_string2","numbers_string3","num_strings4"]
    for i in l:
        count=1
        for j in range(5):
            m=[]
            count=count*10
            m=timeit.repeat("i(count)",5,count)
            #m=t.repeat(5,count)
            print i,(),"count=",count,"min=",min(m),"atuals=",m

当我执行此操作时,由于未定义全局名称i,我收到错误。

2 个答案:

答案 0 :(得分:0)

timeit函数在自己的函数空间中运行。它无法访问您的范围,这就是为什么它提供了一个“setup”参数,它执行该参数来设置时序环境。您需要在字符串中定义所需的任何函数和变量,然后将其作为timeit.repeat参数传递给setup

你似乎也误解了其他一些事情是如何运作的。当您将"i"放入字符串时,它只是字母"i"。它并没有神奇地承担变量i的值。就此而言,"count"也没有。您需要创建一个包含一些实际值的字符串,而不是变量名。

在我看来,你想做这样的事情:

setup = 'from numstring import *' # String to execute to set up the timeit scope
funcs = ["numbers_string1", "numbers_string2", "numbers_string3", "num_strings4"]
for func in funcs: # Better variable names are better!
    for count in (1, 10, 100, 1000, 10000): # Clean up this iteration
        statement = '{f}({n})'.format(f=func, n=count) # the call to test
        m = timeit.repeat(statement, setup=setup, repeat=5)

我强烈建议您read the documentation,因为m=timeit.repeat("i(count)",5,count)首先不是该功能的合法使用。

答案 1 :(得分:0)

timeit的测试在各自独立的范围内执行。这主要是为了使定时不受执行测试的模块中的一些副作用的影响。因此,在测试期间既未定义i,也未定义函数numbers_string1/2/3/4

您可以通过设置它们来导入它们,例如:

timeit.repeat("numbers_string1(count)", 5, count, setup='from __main__ import numbers_string1')

但这不会解决您的问题,因为i仍未定义,即使它已经定义,它也将是一个字符串,而不是您可以执行的函数。你的意图可能是这样的:

timeit.repeat('{}({})'.format(i, count), repeat=5, setup='from __main import ' + i)