Python Timeit和“;全局名称。。。未定义”;

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函数来测试代码性能(在显然更复杂的问题中!

我对代码优化的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函数来测试代码性能(在显然更复杂的问题中!),其中包含:

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值。是否有解决方案?可能重复的