我有四个名为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
,我收到错误。
答案 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)