против чего-то вроде этого:
def time_this(func):
@functools.wraps(func)
def what_time_is_it(*args, **kwargs):
start_time = time.clock()
print 'STARTING TIME: %f' % start_time
result = func(*args, **kwargs)
end_time = time.clock()
print 'ENDING TIME: %f' % end_time
print 'TOTAL TIME: %f' % (end_time - start_time)
return result
return what_time_is_it
Я спрашиваю, потому что писать дескриптор нравится это кажется мне легче и понятнее. Я признаю, что profile/cprofile пытается оценить время компиляции байткода и такое (и вычитает это время из времени выполнения), поэтому более конкретно.
Мне интересно:
Профиль и cProfile не имеют никакого отношения к оценке времени компиляции. Они оценивают время выполнения.
Время компиляции не является проблемой производительности. Не хотите, чтобы ваш код составлялся каждый раз, когда он запускался? import
его, и он будет сохранен как .pyc
и только перекомпилирован, если вы его измените. Просто неважно, сколько времени требуется для компиляции кода (это очень быстро), так как это не нужно делать каждый раз, когда он запускается.
Если вы хотите компиляцию времени, вы можете использовать пакет компилятора.
В основном:
from timeit import timeit
print timeit('compiler.compileFile(' + filename + ')', 'import compiler', number=100)
будет распечатывать время, необходимое для компиляции filename
100 раз.
Если внутри func
вы добавите некоторые списки, сделайте некоторое добавление, посмотрите некоторые переменные в словарях, profile
скажет вам, сколько времени занимает каждая из этих вещей.
Ваша версия не говорит вам об этом. Это также довольно неточно - время, которое вы получаете, зависит от времени, которое требуется, чтобы найти атрибут clock
time
а затем вызвать его.
Если вы хотите, чтобы время было коротким фрагментом кода, используйте timeit
. Если вы хотите профилировать код, используйте profile
или cProfile
. Если то, что вы хотите знать, это то, сколько времени потребовалось для выполнения произвольного кода, но не в каких его частях, где самая медленная, то ваша версия в порядке, если код не займет всего несколько секунд.
Профиль медленнее, чем cProfile, но поддерживает Threads.
cProfile намного быстрее, но AFAIK не будет профилировать потоки (только основной, остальные будут проигнорированы).
profile
делает то, что ваша версия не делает. Он показывает построчно, сколько времени заняла ваша функция, сколько времени заняло выполнение каждой отдельной вещи, а не только общее время выполнения.