Я борюсь с функцией timeit в Python, и, на более глубоком уровне, я очень расстроен причудами этой функции. Я надеюсь, что я смогу помочь в решении этих проблем.Борьба с Python timeit
У меня есть сценарий (назовите его my_script.py
) с множеством различных определений функций, а затем подсчитывается множество других вещей под ними. Я хочу, в частности, только одну из этих функций - назовем ее level_99_function(x)
. У меня большой массив, хранящийся в my_input
. Моя первая попытка:
timeit.timeit('f1(x)', setup = 'my_input')
Python возвращает ошибку: NameError: global name 'angle' is not defined
.
Теперь моя вторая попытка сделать следующее:
print timeit.timeit('level_99_function(x)', setup = 'import numpy as np; import my_script.py; x= np.linspace(0,100)')
Это не создает каких-либо ошибок, но проблема состоит в два раза. Во-первых, и что самое главное, он все еще не время level_99_function
(или, может быть, он просто не печатает на выходе таймера по какой-либо причине?) Во-вторых, оператор import
, кажется, запускает весь скрипт при импорте, который принимает навсегда из-за всего, что у меня есть в этом сценарии, кроме моего level_99_function
.
Как получить информацию о текущей функции здесь? И на более философском уровне, почему эта такая борьба на Питоне? У меня уже есть переменная и определенная функция; все, что я хочу сделать, - это время вызова этой функции с этой переменной. Было бы неплохо не писать сверхдолговую строку кода или писать несколько строк кода, или им нужно импортировать вещи или любой другой материал. Это так же просто, как tic
и toc
в Matlab. Я думаю, что соответствующие команды Python будут использовать «time.clock()» до и после вызова функции, но я прочитал, что это может быть неточным и вводящим в заблуждение.
_ "Операция импорта, похоже, запускает весь скрипт при импорте" _. Возможно, вам понадобится ['if __name__ ==" __main__ ":'] (http://stackoverflow.com/questions/419163/what-does-if-name-main-do) защита вокруг всего не-функционального кода в ваш модуль. – Kevin
'timeit' не эквивалентен' tic ... toc'. Если вам нужна функциональность 'tic ... toc', сделайте что-то вроде:' start = time.clock(); My_function(); print time.clock() - start' –
Re: ваше разочарование: сделайте себе одолжение и вместо этого используйте iPython с магией «% timeit», чтобы сравнить ваши вещи. Он превосходит ванильный 'timeit' во многих отношениях. В остальном вам нужно будет предоставить больше кода. Мы можем * догадаться *, но это не то, для чего вы пришли сюда. – roippi