Как использовать python timeit при передаче переменных в функции?
Я борюсь с этим, используя timeit, и мне было интересно, есть ли у кого-нибудь советы
в основном у меня есть функция (что я передаю значение), что я хочу проверить скорость и создал это:
if __name__=='__main__':
from timeit import Timer
t = Timer(superMegaIntenseFunction(10))
print t.timeit(number=1)
но когда я запускаю его,я получаю странные ошибки, как из модуля timeit.:
ValueError: stmt is neither a string nor callable
Если я запускаю функцию, он отлично работает. Его, когда я обертываю его в модуле time it, Я получаю ошибки(я пробовал использовать двойные кавычки и без..sameoutput).
любые предложения было бы здорово!
спасибо!
4 ответа:
сделать его вызываемым:
if __name__=='__main__': from timeit import Timer t = Timer(lambda: superMegaIntenseFunction(10)) print t.timeit(number=1)должно работать
Timer(superMegaIntenseFunction(10))означает "вызовsuperMegaIntenseFunction(10), затем передайте результат вTimer". Это явно не то, что вы хотите.Timerожидает либо вызываемый (так же, как это звучит: что-то, что можно вызвать, например, функцию), либо строку (чтобы она могла интерпретировать содержимое строки как код Python).Timerработает, вызывая вызываемую вещь повторно и видя, сколько времени требуется.
Timer(superMegaIntenseFunction)пройдет проверку типа, потому чтоsuperMegaIntenseFunctionявляется отзывной. Однако,Timerне знаю, какие значения передатьsuperMegaIntenseFunction.простой способ обойти это, конечно, использовать строку с кодом. Нам нужно передать аргумент 'setup' в код, потому что строка "интерпретируется как код" в новом контексте - у нее нет доступа к тому же
globals, поэтому вам нужно запустить еще один бит кода, чтобы сделать определение доступным - см. ответ @oxtopus.С
lambda(как в ответе @ Pablo), мы можем привязать параметр10для вызова кsuperMegaIntenseFunction. Все, что мы делаем, это создаем другую функцию, которая не принимает аргументов и вызываетsuperMegaIntenseFunctionС10. Это так же, как если бы вы использовалиdefчтобы создать другую функцию, подобную этой, за исключением того, что новая функция не получает имя (потому что оно ей не нужно).
вы должны передавать строку. то есть
t = Timer('superMegaIntenseFunction(10)','from __main__ import superMegaIntenseFunction')
заметки для будущих посетителей. Если вам нужно заставить его работать в
pdbотладчик, иsuperMegaIntenseFunctionне находится в глобальной области, вы можете заставить его работать, добавив кglobals:globals()['superMegaIntenseFunction'] = superMegaIntenseFunction timeit.timeit(lambda: superMegaIntenseFunction(x))обратите внимание, что временные затраты в этом случае немного больше из-за дополнительных вызовов функций. [источник]