Причина того, что Y0
является неопределенной, состоит в том, что вы определили это в строке, но во время анализа в начале выполнения строка еще не вычисляется, чтобы привести переменную в жизнь. Поэтому поместите Y0 = 0
где-нибудь вверху вашего скрипта, чтобы он был определен заранее.
Все внешние функции и переменные должны быть переданы Timer
с использованием аргумента setup
. Поэтому вам нужно "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
, вы можете timeit
распознать их, передав from __main__ import *
в качестве второго аргумента.
Если вы хотите, чтобы timeit
мог изменять ваши переменные, вам не следует передавать им строки. Для этого вам удобнее передавать вызовы. Вы должны передать вызываемый элемент, который изменит желаемую переменную. Вам не нужно setup
тогда. Посмотрите:
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.timeit()
, так как до выполнения вы не можете изменить его значение!