Python Timeit和“;全局名称。。。未定义”;
我对代码优化的timit函数有一个问题。例如,我在文件中编写带参数的函数,我们称之为Python Timeit和“;全局名称。。。未定义”;,python,global-variables,timeit,Python,Global Variables,Timeit,我对代码优化的timit函数有一个问题。例如,我在文件中编写带参数的函数,我们称之为myfunctions.py包含: def func1(X): Y = X+1 return Y import myfunctions X0 = 1 t = Timer("Y0 = myfunctions.func1(X0)") print Y0 print t.timeit() 我在第二个文件test.py中测试这个函数,在这个文件中我调用timer函数来测试代码性能(在显然更复杂的问题中!
myfunctions.py
包含:
def func1(X):
Y = X+1
return Y
import myfunctions
X0 = 1
t = Timer("Y0 = myfunctions.func1(X0)")
print Y0
print t.timeit()
我在第二个文件test.py
中测试这个函数,在这个文件中我调用timer函数来测试代码性能(在显然更复杂的问题中!),其中包含:
def func1(X):
Y = X+1
return Y
import myfunctions
X0 = 1
t = Timer("Y0 = myfunctions.func1(X0)")
print Y0
print t.timeit()
未计算Y0
,即使我对print Y0
行进行注释,也未定义错误全局名称“myfunctions”
如果我使用命令指定设置
t = Timer("Y0 = myfunctions.func1(X0)","import myfunctions")
现在,未定义全局名称“X0”时出现错误
有人知道如何解决这个问题吗?非常感谢。您需要
设置
参数。尝试:
Timer("Y0 = myfunctions.func1(X0)", setup="import myfunctions; X0 = 1")
Y0
未定义的原因是您已在字符串中定义了该变量,但在执行开始时的解析时,尚未对该字符串求值以使变量生效。因此,在脚本顶部的某个位置放置一个Y0=0
,以便事先定义它
所有外部函数和变量必须使用其设置
参数指定给计时器
。因此,您需要“import myfunctions;X0=1”
作为设置参数
这将有助于:
from timeit import Timer
import myfunctions
X0 = 1
Y0 = 0 #Have Y0 defined
t = Timer("Y0 = myfunctions.func1(X0)", "import myfunctions; X0 = %i" % (X0,))
print t.timeit()
print Y0
看看我是如何使用“X0=%I”%(X0,)
传入外部X0变量的实际值的
您可能想知道的另一件事是,如果主文件中有任何函数要在timeit
中使用,您可以通过将from\uuuuu main\uuuu import*
作为第二个参数传递,使timeit
识别它们
如果希望
timeit
能够修改变量,则不应向它们传递字符串。您可以更方便地将可调用项传递给它。您应该传递更改所需变量的可调用变量。您不需要设置
。看:
from timeit import Timer
import myfunctions
def measure_me():
global Y0 #Make measure_me able to modify Y0
Y0 = myfunctions.func1(X0)
X0 = 1
Y0 = 0 #Have Y0 defined
t = Timer(measure_me)
print t.timeit()
print Y0
如您所见,我将
print Y0
放在print t t.timeit()
之后,因为在执行之前不能更改它的值 正如我在问题中提到的,此返回错误“未定义全局名称‘X0’”。全局错误已完全消除。但这不会创建Y0值。是否有解决方案?可能重复的