точно измерять функцию времени python

Мне нужно измерить время выполнения определенных частей моей программы (не для отладки, а как функцию на выходе). Точность важна, потому что общее время будет составлять долю секунды.

Я собирался использовать модуль времени, когда мне приходилось сталкиваться с временем , которое утверждает, что позволяет избежать ряда обычных ловушек для измерения времени выполнения . К сожалению, у него есть ужасный интерфейс, взяв строку в качестве входной информации, которая тогда будет eval.

Итак, нужно ли использовать этот модуль для точного измерения времени или достаточно времени? И каковы подводные камни, на которые он ссылается?

благодаря

7 Solutions collect form web for “точно измерять функцию времени python”

Согласно документации Python, это связано с точностью функции времени в разных операционных системах:

Функция таймера по умолчанию зависит от платформы. В Windows время.clock () имеет микросекундную гранулярность, но гранулярность time.time () составляет 1/60 секунды; на Unix, time.clock () имеет 1 / 100th второй степени детализации и time.time () гораздо точнее. На любой платформе функции таймера по умолчанию измеряют время настенных часов, а не время процессора. Это означает, что другие процессы, запущенные на одном компьютере, могут помешать синхронизации … В Unix вы можете использовать time.clock () для измерения времени процессора.

Вытащить непосредственно из timeit.py :

 if sys.platform == "win32": # On Windows, the best timer is time.clock() default_timer = time.clock else: # On most other platforms the best timer is time.time() default_timer = time.time 

Кроме того, он напрямую связан с настройкой кода выполнения для вас. Если вы используете время, вы должны сделать это сами. Это, конечно, экономит ваше время

Настройка Timeit:

 def inner(_it, _timer): #Your setup code %(setup)s _t0 = _timer() for _i in _it: #The code you want to time %(stmt)s _t1 = _timer() return _t1 - _t0 

Изменить, только Python 3:

Начиная с Python 3.3 вы можете использовать time.perf_counter() (общесистемное время) или time.process_time() (время в масштабе всего процесса), так же, как вы использовали для использования time.clock() :

 from time import process_time t = process_time() #do some stuff elapsed_time = process_time() - t 

Новая функция process_time не будет включать время, прошедшее во время сна.

Вы можете создать контекст синхронизации (см. PEP 343 ), чтобы довольно легко измерить блоки кода.

 from __future__ import with_statement import time class Timer(object): def __enter__(self): self.__start = time.time() def __exit__(self, type, value, traceback): # Error handling here self.__finish = time.time() def duration_in_seconds(self): return self.__finish - self.__start timer = Timer() with timer: # Whatever you want to measure goes here time.sleep(2) print timer.duration_in_seconds() 

Модуль timeit выглядит так, как будто он предназначен для выполнения тестирования производительности алгоритмов, а не для простого мониторинга приложения. Ваш лучший вариант, вероятно, заключается в использовании модуля времени, call time.time() в начале и конце интересующего вас сегмента и вычитании двух чисел. Имейте в виду, что число, которое вы получаете, может иметь гораздо больше десятичных знаков, чем фактическое разрешение системного таймера.

Проанализировали ли вы предоставленный профиль или cProfile?

http://docs.python.org/library/profile.html

Это дает гораздо более подробную информацию, чем просто печать времени до и после вызова функции. Может стоить посмотреть …

Я был слишком раздражен ужасным интерфейсом timeit, поэтому я создал для этого библиотеку, проверьте ее тривиальность в использовании

 from pythonbenchmark import compare, measure import time a,b,c,d,e = 10,10,10,10,10 something = [a,b,c,d,e] def myFunction(something): time.sleep(0.4) def myOptimizedFunction(something): time.sleep(0.2) # comparing test compare(myFunction, myOptimizedFunction, 10, input) # without input compare(myFunction, myOptimizedFunction, 100) 

https://github.com/Karlheinzniebuhr/pythonbenchmark

В документации также упоминается, что time.clock () и time.time () имеют разное разрешение в зависимости от платформы. В Unix time.clock () измеряет время процессора, а не время настенного времени.

timeit также отключает сбор мусора при запуске тестов, что, вероятно, не является тем, что вы хотите для производственного кода.

Я считаю, что time.time () достаточно для большинства целей.

Из Python 2.6 по времени это больше не ограничивается входной строкой. Ссылаясь на документацию :

Изменено в версии 2.6: Параметры stmt и setup теперь могут также принимать объекты, которые могут быть вызваны без аргументов. Это будет включать вызовы к ним в функции таймера, которые затем будут выполняться с помощью timeit (). Обратите внимание, что в этом случае накладные расходы времени немного больше из-за дополнительных вызовов функций.

  • Как измерить время между строками кода в python?
  • Каков надежный метод поиска наиболее трудоемкой части кода?
  • Невозможно сделать работу cProfile в IPython
  • Почему вызов функции / метода в python стоит дорого?
  • Профилирование python с использованием line_profiler - умный способ удаления операторов @profile на лету?
  • Что это за результат cProfile, говорящий мне, что мне нужно исправить?
  • Устранение неисправностей 5 секунд Задержка в представлении формы
  • Что такое «встроенный метод» Python? Как я могу ускорить его?
  • Python - лучший язык программирования в мире.