python — Как можно засечь время выполнения каждой из функций и суммарное время выполнения программы
Чтобы измерить время выполнения программы, можно time
команду использовать (часто встроена в shell):
$ time python -c 'import time; time.sleep(1)' python -c 'import time; time.sleep(1)' 0.01s user 0.00s system 1% cpu 1.021 total
Если команда недоступна, её можно реализовать в Питоне.
Чтобы посмотреть сколько времени индивидуальные функции занимают, можно cProfile
модуль использовать:
$ python -m cProfile -s time your_module.py
В графическом виде результаты удобно в KCachegrind просматривать. Пример команд. Больше вариантов: How can you profile a script?
line_profiler
позволяет построчно сравнение производить.
Содержание:
- timeit
- reporttime.py
- make-figures.py
- reporttime + pandas
Чтобы измерить производительность отдельной функции, можно timeit
модуль использовать:
$ python -m timeit -s 'from insertion_sort import sorted; L = list(range(10**5))' 'sorted(L)'
Тот же интерфейс предоставляет pyperf
модуль (помимо прочего):
$ python -m pyperf timeit -s '. ..' 'sorted(L)'
Документация утверждает, что pyperf
более надёжные результаты выдаёт.
Для интерактивной работы можно %timeit
magic в ipython/jupyter notebook использовать.
Оптимизируя выполнение функции, стоит убедиться что она работает корректно (тесты), что изменения действительно ускорили её работу (сравнение производительности). Для этого можно pytest-benchmark
использовать.
Для удобства сравнения производительности нескольких алгоритмов, можно автоматически соответствующие функции собрать по общему префиксу в имени (
). К примеру, если функции в вопросе можно назвать: sorted_selection
, sorted_insertion
, sorted_bubble
и поместить в daedra.py
файл:
#!/usr/bin/env python import random from reporttime import get_functions_with_prefix, measure import daedra funcs = get_functions_with_prefix('sorted_', module=daedra) for comment, L in [ ("all same", [1] * 10**3), ("range", list(range(10**3))), ("random", list(range(10**3)))]: if comment == "random": random.shuffle(L) measure(funcs, args=[L], comment=comment)
где reporttime.py
. measure()
функция измеряет производительность функций похожим на python -mtimeit
команду способом.
Результаты
name time ratio comment sorted_insertion 184 usec 1.00 all same sorted_selection 55.9 msec 303.86 all same sorted_bubble 59.4 msec 322.92 all same name time ratio comment sorted_insertion 186 usec 1.00 range sorted_selection 57.7 msec 309.44 range sorted_bubble 60.8 msec 326.40 range name time ratio comment sorted_selection 58 msec 1.00 random sorted_insertion 66.2 msec 1.14 random sorted_bubble 119 msec 2.05 random
Таблица показывает, что на уже отсортированном вводе sorted_insertion()
функция заметно выигрывает (в этом случае линейное время для этой функции требуется по сравнению с квадратичным для sorted_selection()
и sorted_bubble()
). Для случайного ввода, производительность примерно одинаковая. sorted_bubble()
хуже во всех вариантах.
В качестве альтернативы можно декоратор использовать такой как @to_compare
, чтобы собрать функции для сравнения и адаптировать их для
скрипта, который измеряет производительность и строит графики. Пример.
Чтобы нарисовать время выполнения функций для разных вводов:
#!/usr/bin/env python #file: plot_daedra.py import random def seq_range(n): return list(range(n)) def seq_random(n): L = seq_range(n) random.shuffle(L) return L if __name__ == '__main__': import sys from subprocess import check_call import daedra from reporttime import get_functions_with_prefix # measure performance and plot it check_call(["make-figures.py"] + [ "--sort-function=daedra." + f.__name__ for f in get_functions_with_prefix('sorted_', module=daedra) ] + [ "--sequence-creator=plot_daedra." + f.__name__ for f in get_functions_with_prefix('seq_') ] + sys.argv[1:])
seq_range()
, seq_random()
задают два типа ввода (уже отсортированный и случайный соответственно). Можно определить дополнительные типы, определив seq_*(n)
функцию. Пример запуска:
$ PYTHONPATH=. python plot_daedra.py --maxn 1024
PYTHONPATH=.
используется, чтобы make-figures.py
смог найти plot_daedra
модуль (с seq_range
, seq_random
функциями) в текущей директории. --maxn
n
, которое в seq_(n)
функции передаётся.Результаты
Рисунки подтверждают, что sorted_insertion()
показывает линейное поведение на отсортированном вводе (seq_range
=0,1,2,3,4,…,n-1
). И квадратичное на случайном вводе (seq_random
). Коэффициент перед log2(N)
показывает приближённо соответствующую степень в функции роста алгоритма в зависимости от размера ввода:
|------------------------------+-------------------| | Fitting polynom | Function | |------------------------------+-------------------| | 1.00 log2(N) + 1.25e-015 | N | | 2.00 log2(N) + 5.31e-018 | N*N | | 1.19 log2(N) + 1.116 | N*log2(N) | | 1.37 log2(N) + 2.232 | N*log2(N)*log2(N) |
Собрав результаты измерений времени выполнения функций сортировки из daedra.py
(sorted_*()
) для разных типов (уже отсортированный/случайный) и размеров ввода (длины от 1 до 100000):
import random import daedra from reporttime import get_functions_with_prefix, measure_func times = {} # (function name, input type, exp size) -> time it takes for f in get_functions_with_prefix('sorted_', module=daedra): for N in range(6): for case, L in [ ("range", list(range(10**N))), ("random", list(range(10**N)))]: if case == "random": random.shuffle(L) times[(f.__name__, case, N)] = measure_func(f, [L])
Удобно исследовать результаты интерактивно, используя pandas.DataFrame
:
import pandas as pd df = pd. DataFrame([dict(function=f, input=i, size=10**n, time=t) for (f,i,n), t in times.items()])
К примеру, чтобы сравнить поведение функций на уже отсортированном вводе:
def plot_input(input): p = df[df.input==input].pivot(index='function', columns='size', values='time') p.T.plot(loglog=True,, title=input) # same style as in @MaxU's answer return p plot_input('range')
Поведение на случайном вводе:
plot_input('random')
Или сравнить поведение одной функции для разных типов ввода на одном графике:
p = df[df.function=='sorted_insertion'].pivot(index='input', columns='size', values='time') p.T.plot(loglog=True,, title='sorted_insertion')
соответствующий jupyter notebook.
Python — расчет времени выполнения
Теги: Использование функции
Во многих случаях нам необходимо вычислить производительность нашей программы. Общим стандартом является сложность времени, поэтому нам необходимо подсчитывать время выполнения программы.
Как правило, существует три способа вычисления времени выполнения программы на Python или блока кода.
- Способ первый
import datetime start = datetime.datetime.now() run_function(): # do something end = datetime.datetime.now() print('totally time is ' end - start)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
import time start = time.time() run_function() end = time.time() print (str(end))
- 1
- 2
- 3
- 4
- 5
- 6
Метод третий:
import time start = time.clock() run_function() end = time.clock() print (str(end-start))
- 1
- 2
- 3
- 4
- 5
- 6
Сравнивая вышеуказанные методы, можно обнаружить, что точность метода 2 относительно высока. Первый метод — это, в основном, связь между производительностью и системой, такой как кристалл, бит. Как правило, метод 2 и метод 3 рекомендуются. Метод 2 показывает время UTC. Точность time.time () очень низкая во многих системах, включая windows.
Руководство по стандартной библиотеке Python рекомендует максимально использовать time.clock () в любой ситуации, но эта функция возвращает реальное время (время стены) под окнами
И метод 1, и метод 2 включают время, когда другие программы используют ЦП. Метод три только вычисляет время процессора программы.
И метод два, и метод три возвращают числа с плавающей точкой
Так кто же точнее, time.clock () и time.time ()? С сомнением я проверил документацию модуля времени Python, где метод clock () имеет такое объяснение (из официальной документации)
Time.clock () возвращает время процессора, и из-за jiffy в Unix точность не будет слишком высокой. Часы превращаются в секунды, разделенные на 1000000.
Использовать ли time.clock () с высокой точностью или time. time () с большей точностью, зависит от платформы. В целом, в системах Unix рекомендуется использовать time.time (), а в системах Windows — time.clock ().
Мы хотим достичь кроссплатформенной точности, мы можем использовать время вместо времени.
import timeit start = timeit.default_timer() do_func() end = timeit.default_timer() print str(end-start)
- 1
- 2
- 3
- 4
- 5
- 6
[1]http://www.cnblogs.com/youxin/p/3157099.html
[2]http://coreygoldberg.blogspot.hk/2008/09/python-timing-timeclock-vs-timetime.html
[3]http://www.cnblogs.com/moinmoin/archive/2011/03/18/python-runtime-measuring.html
[4]http://www.cnblogs.com/BeginMan/p/3178223.html
[5]http://blog.sina.com.cn/s/blog_56d8ea900100xzg3.html
Интеллектуальная рекомендация
VC Non-ASCII Язык Скопируйте в буфер обмена
MFC версия На сегодняшний день я столкнулся с странным явлением, и японская система нажала Ctrl + C на элементе управления, а затем вставила его, чтобы побраться. Невозможно переключиться на метод япо…
Используйте модуль PHP в HTTPD для анализа веб -страницы PHP
Добавить анализ PHP в файл конфигурации HTTPD Измените файл конфигурации Apache, чтобы Apache мог использовать PHP для анализа Файл конфигурации httpd находится на пути /SR/Local/httpd/conf/httpd.conf…
Производитель -Понимание вопроса о выпуске
Описание проблемы: Вовлеченные объекты: производители (производственные данные), потребители (потребительские данные), буфер (посредник) Конкретное описание: Производители и потребители представляют с…
[Проблема] Несколько методов дедупликации массивов
1. Установите с помощью оператора раскрытия, чтобы удалить дублирование (лично считаю наиболее лаконичным) 2. метод дедупликации indexOf () 3.includes () метод дедупликации 4. Оптимизируйте метод масс…
Использование апплета WeChat wx: для
Я видел в официальном документе, что wx: for помещается в список рендеринга. Из этого мы можем приблизительно узнать, что основная функция wx: for — это список. Обычно мы говорим список. Я думаю, что …
Вам также может понравиться
Чтение пути Java
…
ofo запускает «торговый центр со скидками». Пользователи, которые не вернули свои депозиты, могут обменять золотые монеты на выгодные покупки.
[TechWeb] Недавно в официальном приложении ofo была запущена функция «Discount Mall». Пользователи, которые еще не реализовали возврат депозита, могут обменять их по соотношению «1 ю…
RadioButton
Radio buttons are normally used together in a RadioGroup Добавить Radiobutton (по крайней мере два) в радиогруппе Добавьте слушатель на объект, реализуйте интерфейс OnCheckedChangeListener (выберите о…
«С помощью логики Java программы, чтобы понять» первая сводная глава
слово: общественности статической общественности статическойпустотаглавная главнаякласс класс Выход Система из проблемных вопросов, линия печать печать линии Что такое программа? Программу можно рассм…
BZOJ2212: [Poi2011] Вращения деревьев (Rock Valley P3521)
Сегмент дерева слияния BZOJ тематический портал Портал Затерянной Долины Научился объединять отрезки. Для поддерева, независимо от того, переключено оно или нет, оно не повлияет на другие узлы вне под…
Как мне получить время выполнения программы Python? Ru Python
- Ru Python
- время python
- Как мне получить время выполнения программы Python?
У меня есть программа командной строки на Python, для завершения которой требуется некоторое время. Я хочу знать точное время, необходимое для завершения работы.
Я посмотрел модуль timeit
, но, похоже, это только для небольших фрагментов кода. Я хочу посмотреть всю программу.
- Как перенести эту функцию NetHack на Python?
- Проверка дневного времени Python
- time.sleep (x) не работает так, как должно быть?
- Python: Как преобразовать строку в datetime без знания формата?
- Гораздо быстрее вычислительное время в Python
Самый простой способ в Python:
import time start_time = time.time() main() print("--- %s seconds ---" % (time. time() - start_time))
Это предполагает, что ваша программа занимает не менее десятой секунды для запуска.
Печать:
--- 0.764891862869 seconds ---
Я поместил этот модуль timing.py
в свой собственный каталог site-packages
и просто вставляю import timing
в верхней части моего модуля:
import atexit from time import clock def secondsToStr(t): return "%d:%02d:%02d.%03d" % \ reduce(lambda ll,b : divmod(ll[0],b) + ll[1:], [(t*1000,),1000,60,60]) line = "="*40 def log(s, elapsed=None): print line print secondsToStr(clock()), '-', s if elapsed: print "Elapsed time:", elapsed print line print def endlog(): end = clock() elapsed = end-start log("End Program", secondsToStr(elapsed)) def now(): return secondsToStr(clock()) start = clock() atexit.register(endlog) log("Start Program")
Я также могу вызвать timing.log
из моей программы, если есть значительные этапы в программе, которую я хочу показать. Но в том числе время import timing
будет печатать время начала и окончания и общее прошедшее время. (Простите мою неясную функцию secondsToStr
, она просто форматирует число с плавающей запятой секунд до hh: mm: ss.sss form.)
Примечание. Версия вышеуказанного кода Python 3 можно найти здесь или здесь .
В Linux или UNIX:
time python yourprogram.py
В Windows см. Обсуждение Stackoverflow: как измерить время выполнения команды в командной строке Windows?
import time start_time = time.clock() main() print time.clock() - start_time, "seconds"
time.clock()
возвращает время процессора, что позволяет рассчитать только время, используемое этим процессом (в любом случае, Unix). В документации говорится: «В любом случае, это функция, используемая для бенчмаркинга Python или алгоритмов синхронизации»
Вы можете использовать профайлер python cProfile для измерения времени процессора и, кроме того, сколько времени тратится внутри каждой функции и сколько раз каждую функцию вызывается. Это очень полезно, если вы хотите повысить производительность своего скрипта, не зная, с чего начать. Этот ответ на другой вопрос SO довольно хорош. Всегда хорошо смотреть в документах .
Вот пример того, как профилировать скрипт с помощью cProfile из командной строки:
$ python -m cProfile euler048.py 1007 function calls in 0.061 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.061 0.061 <string>:1(<module>) 1000 0.051 0.000 0.051 0.000 euler048.py:2(<lambda>) 1 0.005 0.005 0.061 0.061 euler048.py:2(<module>) 1 0.000 0.000 0.061 0.061 {execfile} 1 0.002 0.002 0.053 0.053 {map} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler objects} 1 0.000 0.000 0.000 0.000 {range} 1 0.003 0.003 0.003 0.003 {sum}
Мне очень нравится ответ Пола МакГира, но я использую Python3. Итак, для тех, кто заинтересован: вот модификация его ответа, который работает с Python 3 на * nix (я полагаю, под Windows, что clock () следует использовать вместо time ()):
#python3 import atexit from time import time from datetime import timedelta def secondsToStr(t): return str(timedelta(seconds=t)) line = "="*40 def log(s, elapsed=None): print(line) print(secondsToStr(time()), '-', s) if elapsed: print("Elapsed time:", elapsed) print(line) print() def endlog(): end = time() elapsed = end-start log("End Program", secondsToStr(elapsed)) def now(): return secondsToStr(time()) start = time() atexit. register(endlog) log("Start Program")
Если вы сочтете это полезным, вы все равно должны проголосовать за свой ответ вместо этого, так как он выполнял большую часть работы;).
Мне нравится вывод, предоставляемый модулем datetime
, где временные дельта-объекты показывают время, часы, минуты и т. Д., Если необходимо, с точки зрения человека.
Например:
from datetime import datetime start_time = datetime.now() # do your work here end_time = datetime.now() print('Duration: {}'.format(end_time - start_time))
Пример вывода, например
Duration: 0:00:08.309267
или
Duration: 1 day, 1:51:24.269711
Обновление: как отметил Дж. Ф. Себастьян, этот подход может столкнуться с некоторыми сложными случаями с местным временем, поэтому безопаснее использовать:
import time from datetime import timedelta start_time = time.monotonic() end_time = time.monotonic() print(timedelta(seconds=end_time - start_time))
Еще лучше для Linux: /usr/bin/time
$ /usr/bin/time -v python rhtest2. py Command being timed: "python rhtest2.py" User time (seconds): 4.13 System time (seconds): 0.07 Percent of CPU this job got: 91% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.58 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 0 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 15 Minor (reclaiming a frame) page faults: 5095 Voluntary context switches: 27 Involuntary context switches: 279 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
Как правило, просто time
– это более простая оболочка, которая затеняет более способную /usr/bin/time
.
Решение rogeriopvl отлично работает, но если вы хотите получить более конкретную информацию, вы можете использовать встроенный профилировщик python. Проверьте эту страницу:
http://docs.python.org/library/profile.html
профайлер рассказывает вам много полезной информации, например, время, затрачиваемое на каждую функцию
from time import time start_time = time() ... end_time = time() time_taken = end_time - start_time # time_taken is in seconds hours, rest = divmod(time_taken,3600) minutes, seconds = divmod(rest, 60)
Я посмотрел модуль timeit, но, похоже, это только для небольших фрагментов кода. Я хочу посмотреть всю программу.
$ python -mtimeit -n1 -r1 -t -s "from your_module import main" "main()"
Он запускает your_module.main()
один раз и печатает прошедшее время с использованием функции time.time()
в качестве таймера.
Эмулировать /usr/bin/time
в Python см. Подпроцесс Python с / usr / bin / time: как фиксировать информацию о времени, но игнорировать все остальные данные? ,
Чтобы измерить время процессора (например, не включать время во время time. sleep()
) для каждой функции, вы можете использовать модуль profile
( cProfile
на Python 2):
$ python3 -mprofile your_module.py
Вы можете передать команду -p
to timeit
выше, если вы хотите использовать тот же таймер, что и модуль profile
.
См. Как настроить профиль Python?
Ipython «timeit» любой скрипт:
def foo(): %run bar.py timeit foo()
time.clock ()
Устаревший с версии 3.3: поведение этой функции зависит от платформы: вместо этого используйте perf_counter () или process_time () , в зависимости от ваших требований, чтобы иметь четко определенное поведение.
time.perf_counter ()
Возвратите значение (в дробных секундах) счетчика производительности, то есть часы с самым высоким доступным разрешением для измерения короткой продолжительности. Он включает время, прошедшее во время сна, и является общесистемным.
time.process_time ()
Возвращает значение (в дробных секундах) суммы системного и пользовательского времени процессора текущего процесса. Это не включает время, прошедшее во время сна.
start = time.process_time() ... do something elapsed = (time.process_time() - start)
Следующий фрагмент печатает прошедшее время в удобном для человека формате <HH:MM:SS>
.
import time from datetime import timedelta start_time = time.time() # # Perform lots of computations. # elapsed_time_secs = time.time() - start_time print "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs))
Мне тоже нравится ответ Пола МакГира и придумал форму менеджера контекста, которая соответствовала моим потребностям.
import datetime as dt import timeit class TimingManager(object): """Context Manager used with the statement 'with' to time some execution. Example: with TimingManager() as t: # Code to time """ clock = timeit.default_timer def __enter__(self): """ """ self.start = self.clock() self.log('\n=> Start Timing: {}') return self def __exit__(self, exc_type, exc_val, exc_tb): """ """ self.endlog() return False def log(self, s, elapsed=None): """Log current time and elapsed time if present. :param s: Text to display, use '{}' to format the text with the current time. :param elapsed: Elapsed time to display. Dafault: None, no display. """ print s.format(self._secondsToStr(self.clock())) if(elapsed is not None): print 'Elapsed time: {}\n'.format(elapsed) def endlog(self): """Log time for the end of execution with elapsed time. """ self.log('=> End Timing: {}', self.now()) def now(self): """Return current elapsed time as hh:mm:ss string. :return: String. """ return str(dt.timedelta(seconds = self.clock() - self.start)) def _secondsToStr(self, sec): """Convert timestamp to h:mm:ss string. :param sec: Timestamp. """ return str(dt. datetime.fromtimestamp(sec))
Существует модуль timeit
который может использоваться для временного времени выполнения питонных кодов. Он содержит подробную документацию и примеры в документах python ( https://docs.python.org/2/library/timeit.html )
Это ответ Пола МакГира, который работает для меня. На всякий случай у кого-то возникли проблемы с запуском этого.
import atexit from time import clock def reduce(function, iterable, initializer=None): it = iter(iterable) if initializer is None: value = next(it) else: value = initializer for element in it: value = function(value, element) return value def secondsToStr(t): return "%d:%02d:%02d.%03d" % \ reduce(lambda ll,b : divmod(ll[0],b) + ll[1:], [(t*1000,),1000,60,60]) line = "="*40 def log(s, elapsed=None): print (line) print (secondsToStr(clock()), '-', s) if elapsed: print ("Elapsed time:", elapsed) print (line) def endlog(): end = clock() elapsed = end-start log("End Program", secondsToStr(elapsed)) def now(): return secondsToStr(clock()) def main(): start = clock() atexit. register(endlog) log("Start Program")
вызовите timing.main()
из вашей программы после импорта файла.
Чтобы использовать обновленный ответ metakermit для python 2.7, вам понадобится монотонный пакет.
Затем код будет выглядеть следующим образом:
from datetime import timedelta from monotonic import monotonic start_time = monotonic() end_time = monotonic() print(timedelta(seconds=end_time - start_time))
Время выполнения программы программы Python может быть непоследовательным в зависимости от:
- Та же программа может быть оценена с использованием разных алгоритмов
- Время работы варьируется между алгоритмами
- Время выполнения варьируется между реализациями
- Продолжительность работы зависит от компьютеров
- Продолжительность работы не предсказуема на основе небольших входов
Это объясняется тем, что наиболее эффективным способом является «Порядок роста» и выучить примечание «О», чтобы сделать это правильно, https://en. wikipedia.org/wiki/Big_O_notation
В любом случае вы можете попытаться оценить производительность любой программы Python на определенных этапах машинного счета в секунду, используя этот простой алгоритм: адаптируйте это к программе, которую вы хотите оценить
import time now = time.time() future = now + 10 step = 4 # why 4 steps? because until here already 4 operations executed while time.time() < future: step += 3 # why 3 again? because while loop execute 1 comparison and 1 plus equal statement step += 4 # why 3 more? because 1 comparison starting while when time is over plus final assignment of step + 1 and print statement print(str(int(step / 10)) + " steps per second")
Надеюсь, это поможет вам.
Просто используйте модуль timeit
. Он работает как с Python 2, так и с Python 3
import timeit start = timeit.default_timer() #ALL THE PROGRAM STATEMETNS stop = timeit.default_timer() execution_time = stop - start print("Program Executed in "+execution_time) #It returns time in sec
Он возвращается в секундах, и вы можете получить время выполнения. Просто, но вы должны написать их в Главной функции, которая запускает выполнение программы. Если вы хотите получить время выполнения, даже когда вы получите ошибку, тогда возьмите свой параметр «Начать» и подсчитайте там, как
def sample_function(start,**kwargs): try: #your statements Except: #Except Statements stop = timeit.default_timer() execution_time = stop - start print("Program Executed in "+execution_time)
- Удаление элемента из списка – во время итерации – что случилось с этой идиомой?
- Какие ограничения имеют ограничения в Python по сравнению с закрытием языка X?
- Вопросы времени и времени, в то время как предсказание временных рядов в Pandas
- TypeError: объект ‘datetime.datetime’ не может быть вызван
- Как получить текущее время в Python
- Функции синхронизации
- Почему существуют различия в Python time.time () и time.clock () в Mac OS X?
- Получать длительность теста единицы python в секундах
- Возможно ли, чтобы в течение двух-трех минут с помощью Mktime Python завершился с ошибкой «вне диапазона»?
- Доступ к значениям datetime. now () в Python
- Как получить min, seconds и milliseconds из datetime.now () в python?
Как ограничить время выполнения функции python
Как ограничить время выполнения вызова функции в Python
В моем коде есть вызов функции, связанный со сокетами, эта функция находится из другого модуля, поэтому из-под моего контроля проблема состоит в том, что он блокирует время от времени, что совершенно неприемлемо. Как ограничить время выполнения функции из мой код? Я предполагаю, что решение должно использовать другой поток.
Я не уверен, насколько кросс-платформенный это может быть, но использование сигналов и сигналов тревоги может быть хорошим способом взглянуть на это. С небольшой работой вы могли бы сделать это полностью общим и использовать в любой ситуации.
Итак, ваш код будет выглядеть примерно так.
Улучшение ответа @rik.the.vik будет заключаться в использовании инструкции with , чтобы дать функции тайм-аута синтаксического сахара:
Здесь используется способ Linux/OSX для ограничения времени работы функции. Это на случай, если вы не хотите использовать потоки и хотите, чтобы ваша программа дождалась окончания функции или истечет срок.
Выполнение этого из обработчика сигнала опасно: вы можете быть внутри обработчика исключений во время поднятия исключения и оставлять вещи в разбитом состоянии. Например,
Если ваше исключение создано здесь(), временный файл никогда не будет удален.
Решение здесь заключается в том, что асинхронные исключения переносятся до тех пор, пока код не будет находиться внутри кода обработки исключений (исключающий или окончательный блок), но Python этого не делает.
Обратите внимание, что это не прерывает ничего при выполнении собственного кода; он только прервет его, когда функция вернется, поэтому это может не помочь этому конкретному случаю. (Сам SIGALRM может прервать вызов, который блокирует — но код сокета обычно просто повторяет попытку после EINTR.)
Выполнение этого с помощью потоков — лучшая идея, поскольку она более портативна, чем сигналы. Поскольку вы начинаете рабочий поток и блокируете его до тех пор, пока он не завершится, нет никаких обычных concurrency проблем. К сожалению, не существует возможности для асинхронного предоставления исключения в другой поток в Python (это могут использовать другие API-интерфейсы потоков). Он также будет иметь ту же проблему с отправкой исключения во время обработчика исключений и требует того же исправления.
Я предпочитаю подход контекстного менеджера, потому что он позволяет выполнять несколько операторов python внутри оператора with time_limit . Поскольку в системе Windows нет SIGALARM , более переносимый и, возможно, более простой метод может использовать Timer
Ключевым моментом здесь является использование _thread.interrupt_main для прерывания основного потока из потока таймера. Одно из предостережений состоит в том, что основная нить не всегда реагирует на KeyboardInterrupt , поднятый Timer быстро. Например, time.sleep() вызывает системную функцию, поэтому KeyboardInterrupt будет обрабатываться после вызова sleep .
Единственным «безопасным» способом сделать это на любом языке является использование вторичного процесса для выполнения этого тайм-аута, в противном случае вам нужно создать свой код таким образом, чтобы он безопасно выполнял время самостоятельно, например, путем проверки времени, прошедшего в цикле или аналогичном. Если изменение метода не является вариантом, поток будет недостаточным.
Почему? Потому что вы рискуете оставить вещи в плохом состоянии, когда вы это делаете. Если поток просто убит средним методом, удерживаемые блокировки и т.д. Будут просто удерживаться и не могут быть освобождены.
Итак, посмотрите на процесс, не смотрите на поток.
Вам не нужно использовать потоки. Вы можете использовать другой процесс для выполнения блокировки, например, возможно, используя модуль subprocess. Если вы хотите разделить структуры данных между различными частями вашей программы, то Twisted — отличная библиотека для того, чтобы дать вам контроль над этим, и я ‘d рекомендовать его, если вы заботитесь о блокировке и ожидаете, что эта проблема будет много. Плохая новость с Twisted — вам нужно переписать свой код, чтобы избежать блокировки, и есть справедливая кривая обучения.
Вы можете использовать потоки, чтобы избежать блокировки, но я рассматривал бы это как последнее средство, поскольку оно предоставляет вам целый мир боли. Прочтите хорошую книгу на concurrency, прежде чем даже подумать об использовании потоков в производстве, например. Жан Бэкон «Параллельные системы». Я работаю с кучей людей, которые действительно охлаждают высокопроизводительные материалы с помощью потоков, и мы не вводим темы в проекты, если они нам действительно не нужны.
Понимание класса таймера Python с примерами
Если мы хотим задержать выполнение функции на определенное время, мы можем использовать класс python timer. start() и cancel () – это два его метода.
- Автор записи
Понимание класса таймера Python с примерами
Python имеет тысячи модулей и библиотек для удовлетворения потребностей программиста. Однако, чтобы сделать их полезными, вы должны сначала понять их, а затем применить. Без предварительного знания определенных модулей неясно, что вы хотите сделать и что на самом деле делает модуль. Время-один из важных факторов в задачах кодирования. Все коды предназначены для того, чтобы уменьшить работу человека, используя свои мощные алгоритмы. Тайм-менеджмент оказывает большое влияние на анализ производительности вашего кода. Вот почему сегодня мы подробно узнаем о том, как работает таймер в Python.
Python Timer-это класс/библиотека для управления временной сложностью вашего кода. Используя несколько временных модулей, вы можете создать систему в своем коде, чтобы проверить время, затраченное соответствующим фрагментом кода. Существуют различные типы реализаций таймера в python в соответствии с потребностями пользователя, а именно функция таймера python (для проверки времени выполнения скрипта), таймер потоковой передачи python (для проверки времени, затраченного потоком на завершение), таймер обратного отсчета python (создание таймера обратного отсчета) и базовый модуль времени python (для помощи в других действиях).
Все эти реализации таймера функционируют по-разному и фокусируются на предоставлении различного использования конечному пользователю. В этом посте мы подробно рассмотрим каждую реализацию таймера. Вы можете использовать Оглавление, чтобы перейти к соответствующей реализации таймера python.
Основные Функции Таймера Python
Самый важный модуль в python относительно времени-это href=”https://docs.python.org/3/library/time.html”>время. Этот модуль содержит все основные функции для проверки времени и его анализа. Этот анализ поможет вам понять производительность вашего кода и его эффективность. Мы рассмотрим каждую из важных функций этого модуля вместе с примерами. href=”https://docs.python.org/3/library/time.html”>время. Этот модуль содержит все основные функции для проверки времени и его анализа. Этот анализ поможет вам понять производительность вашего кода и его эффективность. Мы рассмотрим каждую из важных функций этого модуля вместе с примерами.
Ниже приведены основные функции таймера Python, использующие модуль time –
- time.time()
- time.thread_time()
- time.process_time()
- time.perf_counter()
- time.monotonic()
Функция time.time
time.time() возвращает время в секундах (float) после эпохи. Как правило, эпоха устанавливается на январь 1, 1970, 00:00:00 (UTC), и возвращается количество секунд после этой эпохи. Эта функция зависит от времени компьютера для вычисления количества секунд. Если вы измените компьютерное время между выполнением python, вы можете получить странные числа, используя эту функцию.
Во-первых, мы начинаем с импорта модуля времени. Этот модуль содержит все основные функции времени, которые мы будем использовать в этом разделе. В начале кода мы объявим переменную start как time.time(). Это сохранит текущее время процессора в float number из эпохи. Мы будем использовать эту начальную переменную в качестве ориентира для измерения времени. Следующая часть содержит все коды, которые вы хотите использовать (В этом примере мы использовали циклы for). Аналогично, запишите время окончания работы процессора (время по умолчанию) и проверьте общее время выполнения с помощью end – start.
Это выведет время, затраченное кодом в секундах. С помощью этой техники вы можете проверить время, затраченное вашим кодом. Единственная проблема с этим методом заключается в том, что процессорное время может быть изменено во время выполнения кода. Это приведет к проблемному поведению в python timer.
Функциональное время.Thread_time
time.thread_time() возвращает сумму системного и процессорного времени (float) в текущем запущенном потоке. Более того, он не включает в себя время, которое вы проводите в функции time.sleep(). Поскольку функция зависит от потока, вы можете использовать эту функцию для записи временных различий до тех пор, пока ссылки на время принадлежат одному и тому же потоку.
Поскольку thread_time возвращает специфичное для потока время, мы должны убедиться, что используем ссылки в том же потоке . Для этого мы создали экземпляр потока функции ‘hello’ и рассчитали время, затраченное потоком внутри него. Однако убедитесь, что вы не можете получить текущее время, вызвав thread_time() , поскольку он возвращает дробное значение.Но вы определенно можете проверить разницу между двумя последовательными ссылками, если они принадлежат одному потоку.
Функциональное время.Process_time
time.process_time() возвращает ссылку на время в дробных секундах (float) суммы системного времени и процессорного времени текущего прогресса. Как и thread_time, эта функция не измеряет время, проведенное в функции time.sleep(). Более того, эта функция создает ссылку на основе процесса. As в результате этого будет иметь смысл только разница во времени между двумя последовательными ссылками.
Мы начинаем с импорта функции process_time и записываем время начала и окончания между кодом. Единственное различие между устаревшими time.time() и time.process_time() заключается в том, что processing time записывает временные ссылки текущего процесса, тогда как time() записывает абсолютное время системы.
Время работы.
Perf_counterPerf Counter расшифровывается как Performance Counter. Эта функция возвращает значение с высоким разрешением времени, которое является действительным в течение короткого периода времени. Эта функция используется для получения точного отсчета времени между двумя ссылками. Поскольку другие функции таймера python не включают время сна, perf_counter также не включает его. Давайте перейдем к примеру –
Счетчик perf можно использовать так же, как таймер процесса или таймер потока. Разница лишь в том, что счетчик perf вернет высокое точное значение прошедшего времени. Но убедитесь, что вы используете этот между небольшими процессами, так как он использует высокую точность. Мы использовали простой цикл, чтобы проверить время, затраченное им.
Функция времени.монотонная
Monotonic-это таймер python , который не может идти назад. При выполнении скрипта python время может быть изменено пользователем и может иметь огромное значение при реализации таймера в python. Но монотонный таймер гарантирует, что отсчеты времени приспосабливаются к внешним изменениям.
Сначала мы импортируем монотонную функцию из модуля времени. Затем создайте две ссылки с именами start и end в верхней и нижней части кода. Это позволит измерить время между двумя ссылками и избежать всех внешних изменений системного времени.
Пользовательские Классы таймера Python
Вы можете создать свой собственный класс таймера, чтобы делать все в соответствии с вашими потребностями. Одним из главных преимуществ создания пользовательского класса является то, что вы можете управлять всем временем в одной строке. Вам не нужно каждый раз импортировать класс time и записывать ссылки. Кроме того, вы можете сбросить свои данные и записать все прошлые исполнения времени, чтобы выбрать лучший алгоритм для вас.
В этом разделе будет создан пользовательский класс для управления временем и регистрации всех временных различий в ваших кодах. Давайте нырнем прямо в него –
Начнем с импорта модуля времени. Затем инициализируйте класс таймера python и начните определять атрибуты и методы. До сих пор мы включали только базовый атрибут, чтобы сохранить начальную ссылку класса. Чтобы сделать его более сложным, вы можете создать несколько атрибутов. На данный момент существует три метода, перечисленных ниже –
- start – (Необязательно) Чтобы запустить таймер.
- log – Регистрировать текущее прошедшее время относительно времени начала.
- milestone – Сбросить таймер и начать его отсчет с 0.
Примеры использования вышеуказанного класса приведены ниже. Как вы можете видеть, вы можете сохранить свой код чистым, создав пользовательский класс таймера и повысив гибкость.
Таймер Python с использованием потоковой передачи
Когда мы хотим выполнить какую-то операцию или хотим, чтобы наша функция выполнялась через определенное время, мы используем класс Python Timer. Класс timer является подклассом класса threading. Технически можно сказать, что мы создаем объекты таймера, когда хотим, чтобы действия (функции) были ограничены временем.
Например, предположим, что мы хотим организовать викторину, где участник должен ответить на каждый вопрос за 10 секунд. Здесь мы можем создать таймер, который будет работать в фоновом режиме, а тем временем участник будет думать над ответом. Теперь давайте разберемся, как создать объект timer .
Синтаксис класса Timer в Python
Если вы не поняли, что делает класс Timer, вы можете думать об этом следующим образом – Класс Timer вызывает функцию через заданное количество секунд.
Чтобы запустить таймер, нам нужно вызвать start()(как и обычные потоки), а чтобы остановить таймер, пока он все еще находится в фоновом режиме, мы можем вызвать cancel().
Чтобы использовать класс Timer, нам нужно импортировать класс threading
Параметры-
Интервал– Время (в секундах), которое вы хотите подождать перед вызовом следующей функции. Он может быть либо в float, либо в integer. Например, в течение 3 секунд.
Функция – Функция, которую вы хотите вызвать через указанный промежуток времени.
Распространенным способом описания параметров *args и **kwargs является- создание объекта таймера, который запускает функцию с аргументами’ args’ и аргументами ключевых слов’ kwargs’ после того, как прошли интервальные секунды. Args должны быть в виде списка и ключевого слова args или kwargs в виде словаря .
Тип возврата-
Он просто вызывает функцию, указанную в параметрах.
Методы в классе Timer
- start() – Это означает начало выполнения таймера.
- Cancel ()– Во время выполнения таймера мы можем вызвать функцию cancel, если хотим остановить его ().
Создание объекта таймера
<сильный>а. Понимание основ
Чтобы понять, как работает объект Timer, давайте создадим небольшую программу, которая поможет нам понять основы класса.
Вы лучше поймете функционирование вышеприведенной программы, когда попытаетесь запустить ее самостоятельно href=”https://en.wikipedia.org/wiki/System”>система. href=”https://en.wikipedia.org/wiki/System”>система.
<сильный>б. Использование метода отмены
Давайте посмотрим, как использовать функцию cancel() класса Timer.
c. Как использовать параметр ‘args’ класса python timer
Когда нам нужно дать аргументы функции, которую нужно вызвать, мы используем параметр args. Мы должны дать аргумент args в массиве.
Теперь, когда мы много говорили о времени, в качестве бонуса давайте сделаем программу, которая будет действовать как таймер обратного отсчета.
Таймер обратного отсчета в python
Использование модуля времени
Использование класса python Timer
Таймеры Python как контекстные менеджеры
Контекстные менеджеры-это лучший способ избежать ошибок памяти и последующих сбоев. Все должны были знать о “with” заявлении в Python. Это утверждение гарантирует, что нам не нужно заботиться о том, чтобы многие объекты закрывались независимо. Каждый мог бы использовать его с комбинацией функций with и open(). Итак, переходя к главному вопросу, можем ли мы создать контекстные менеджеры для таймеров Python?
<сильный>Да. Благодаря множеству функций перегрузки мы можем легко создать наш собственный таймер python в качестве контекстного менеджера всего за несколько строк. Давайте начнем с примера, где вы должны измерить время выполнения программы. Без переопределения всех переменных один контекстный менеджер может использоваться многократно для многократного измерения времени. Следующая программа демонстрирует это.
Мы начинаем с создания класса с именем “Timer_Python pool.” Затем мы настраиваем операторы, чтобы сделать их полезными в качестве контекстного менеджера. __enter__ функция выполняется в начале контекста, а __exit__ выполняется в конце контекста. Создание точки отсчета между этими двумя функциями может дать вам точное время, необходимое контексту для выполнения.
Python Timer Decorators
Декораторы-это дополнительная поддержка для любого вида функций. Также называемый метапрограммированием, вы можете изменить/добавить к нему функциональность. Python Timer Decorators-это самый простой способ реализации функций таймера в python. После объявления вы можете использовать декораторы в одной строке, даже не зная их. Кроме того, вы можете применить их к каждой функции в вашем коде, чтобы проверить, какой код занимает больше всего времени для выполнения.
Чтобы создать цепной декоратор, вам нужно объявить несколько вложенных функций. Назовите другую функцию своим основным именем декоратора и внутренним для любого случайного имени. Внутренняя функция извлекает ссылку на функцию, используемую ниже декоратора.
Как обычно, мы начинаем с импорта самого важного модуля из python “time.” Затем мы создаем декоратор с именем “check_time.” Внутри него мы добавляем вложенную внутреннюю функцию, где мы можем создавать ссылки на время. Эти две ссылки расположены так, что обе они находятся между выполнением функции.
Далее мы создаем тестовую функцию с именем “задача”, чтобы проверить, работает ли наша задача. Затем добавьте сверху декоратора. Как<сильный> декоратор будет творить свою магию и печатать время, затраченное функцией.
Перезарядка таймера Python
Python Timer Cooldown-это способ измерения таймера в обратном направлении. Создавая пользовательский класс таймера, мы можем регистрировать время в каждой точке вашего кода. Вы можете экспортировать этот класс как модуль и установить его как зависимость в своем коде. Затем, используя одну строку, вы можете импортировать ее –
Другие Модули Таймера Python
Python содержит тысячи модулей и миллионы фрагментов кода. Мы всегда можем использовать модули с открытым исходным кодом для использования таймеров python. Github-это самое большое место для поиска таких модулей. Давайте сразу перейдем к этим модулям –
- term down: Продвинутый таймер python, созданный с использованием различных символов ASCII. Используя этот скрипт, вы можете создать простой таймер обратного отсчета в вашем терминале и выполнить команду в конце. Самое главное, что он имеет поддержку голосового обратного отсчета.
- MobTimer.Python: Таймер на основе графического интерфейса, созданный на python. Этот скрипт создает полноэкранные таймеры с несколькими опциями. Наряду с этим, вы можете запускать несколько раз на вашем экране одновременно с помощью этой программы.
- timer: Это самый простой таймер на основе графического интерфейса, созданный на python (Tkinter). Такие функции, как несколько таймеров, меток и многопоточность, делают его более жизнеспособным по сравнению с другими программами.
- code timing: Этот класс таймера записывает все ваши прошлые времена выполнения для определенного именованного процесса. Вы можете проверить минимальное время, максимальное время, среднее время и среднее время для конкретного процесса вместе с записями. Этот модуль можно использовать несколькими способами, а именно как контекстный менеджер и как декоратор.
- cTimer: crime-это таймер с точностью до наносекунды в python. Этот модуль использует API языка c для точной записи времени. Если вы ищете хардкорные модули точной записи времени, то это самый лучший вариант. (Примечание: В последних обновлениях python модуль time добавлен с функциями записи времени в наносекундах)
Должен Читать:
- Как преобразовать строку в нижний регистр в
- Как вычислить Квадратный корень
- Пользовательский ввод | Функция ввода () | Ввод с клавиатуры
- Лучшая книга для изучения Python
Вывод
В основном все используют таймеры для трех целей. Первый-это запись времени выполнения вашего кода. А во-вторых, добавить напоминание о чем-то с помощью таймера. К счастью, оба они могут быть созданы в Python. Используя различные модули и библиотеки, вы можете гарантировать, что записываете время с предельной точностью.
И последнее, но не менее важное: таймер – это подкласс класса threading в python. Если мы хотим запустить какую-либо функцию через определенный промежуток времени, мы можем использовать класс python timer. В параметре args, который по умолчанию равен None, мы можем указать аргументы, которые мы хотим передать методу обратного вызова .
Попробуйте запустить программы на вашей стороне и дайте нам знать, если у вас есть какие-либо вопросы.
Как ограничить время выполнения функции и реализовать добавление новых функций
Как ограничить время выполнения функции
Есть функция main, которая вызывает функцию doter. doter должна работать заданное время. Я не.
Как ограничить время выполнения программы?
При выполнении макроса у меня получается(непонятно где) бесконечный цикл. Можно ли просто как-то.
Как ограничить время выполнения программы?
Добрый день! Задали написать программу, следующего содержания: "Для натурального числа сумма.
Ограничить время выполнения метода
Привет! Есть у меня один метод, который может выполняться очень долго, а может и за пару секунд.
Ограничить время выполнения команды
Собственно сабж, как можно реализовать ограничение на время работы команды. Допустим, если если.
Ограничить время выполнения HTTP запроса
Всем привет Имеется код, работающий на отдельном сервисе BufferedReader rdr = null;.
Ограничить время ожидания выполнения TADOQuery.Open
Добрый день, Пишу на Delphi 7, мне нужно сделать чтобы если выполнение TADOQuery продолжается.
Как реализовать паузу во время выполнения программы
Как реализовать паузу во время выполнения программы
Как получить время выполнения программы Python?
У меня есть программа командной строки в Python, который занимает некоторое время, чтобы закончить. Я хочу знать точное время, которое нужно, чтобы закончить бег.
и timeit
module, но, похоже, это только для небольших фрагментов кода. Я хочу засечь время всей программы.
самый простой способ в Python:
import time start_time = time.time() main() print("--- %s seconds ---" % (time. time() - start_time))
это предполагает, что ваша программа занимает по крайней мере десятую часть секунды для запуска.
принты:
--- 0.764891862869 seconds ---
1091
поделиться
автор: rogeriopvl
Я положил это timing.py
модуль в свои
175
поделиться
автор: PaulMcG
в Linux или UNIX:
time python yourprogram.py
в Windows см. Это обсуждение Stackoverflow:как измерить время выполнения команды в командной строке windows?
126
поделиться
автор: steveha
import time start_time = time.clock() main() print time.clock() - start_time, "seconds"
time.clock()
возвращает процессорное время, что позволяет рассчитать только время, используемое этим процессом (в Unix в любом случае). В документации говорится:»в любом случае, это функция для использования для бенчмаркинга Python или алгоритмов синхронизации»
51
поделиться
автор: newacct
Мне очень нравится ответ пола Макгира, но я использую Python3. Итак, для тех, кому интересно: вот модификация его ответа, которая работает с Python 3 на *nix (я полагаю, под Windows, что часы () должны использоваться вместо time ()):
#python3 import atexit from time import time, strftime, localtime from datetime import timedelta def secondsToStr(elapsed=None): if elapsed is None: return strftime("%Y-%m-%d %H:%M:%S", localtime()) else: return str(timedelta(seconds=elapsed)) def log(s, elapsed=None): line = "="*40 print(line) print(secondsToStr(), '-', s) if elapsed: print("Elapsed time:", elapsed) print(line) print() def endlog(): end = time() elapsed = end-start log("End Program", secondsToStr(elapsed)) start = time() atexit. register(endlog) log("Start Program")
Если вы считаете это полезным, вы все равно должны проголосовать за его ответ вместо этого, так как он сделал большую часть работы ;).
44
поделиться
автор: Nicojo
вы можете использовать профайл python profiler для измерения процессорного времени и дополнительно, сколько времени тратится внутри каждой функции и сколько раз вызывается каждая функция. Это очень полезно, если вы хотите улучшить производительность вашего скрипта, не зная, с чего начать. ответ к другому вопросу SO довольно хорошо. Всегда хорошо посмотреть в документы тоже.
вот пример того, как профилировать скрипт с помощью cProfile из командной строки:
$ python -m cProfile euler048.py 1007 function calls in 0.061 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.061 0.061 <string>:1(<module>) 1000 0. 051 0.000 0.051 0.000 euler048.py:2(<lambda>) 1 0.005 0.005 0.061 0.061 euler048.py:2(<module>) 1 0.000 0.000 0.061 0.061 {execfile} 1 0.002 0.002 0.053 0.053 {map} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler objects} 1 0.000 0.000 0.000 0.000 {range} 1 0.003 0.003 0.003 0.003 {sum}
38
поделиться
автор: jacwah
мне нравится вывод datetime
модуль обеспечивает, где объекты перепада времени показывают дни, часы, минуты etc. по мере необходимости в удобочитаемом виде.
например:
from datetime import datetime start_time = datetime.now() # do your work here end_time = datetime.now() print('Duration: {}'.format(end_time - start_time))
пример вывода, например
Duration: 0:00:08.309267
или
Duration: 1 day, 1:51:24. 269711
обновление:import time
from datetime import timedelta
start_time = time.monotonic()
end_time = time.monotonic()
print(timedelta(seconds=end_time - start_time))
31
поделиться
автор: metakermit
еще лучше для Linux: /usr/bin/time
$ /usr/bin/time -v python rhtest2.py Command being timed: "python rhtest2.py" User time (seconds): 4.13 System time (seconds): 0.07 Percent of CPU this job got: 91% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.58 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 0 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 15 Minor (reclaiming a frame) page faults: 5095 Voluntary context switches: 27 Involuntary context switches: 279 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
нормально, просто time
является более простой оболочкой, построенной, что тени более способны /usr/bin/time
.
22
поделиться
автор: u0b34a0f6ae
решение rogeriopvl отлично работает, но если вам нужна более конкретная информация, вы можете использовать встроенный профилировщик python. Проверьте эту страницу:
http://docs.python.org/library/profile.html
профилировщик говорит вам много полезной информации, такой как время, проведенное в каждой функции
12
поделиться
автор: wezzy
следующий фрагмент печатает истекшее время в хорошем читаемом человеком .
import time from datetime import timedelta start_time = time.time() # # Perform lots of computations. # elapsed_time_secs = time.time() - start_time msg = "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs)) print(msg)
10
поделиться
автор: Sandeep
from time import time start_time = time() . .. end_time = time() time_taken = end_time - start_time # time_taken is in seconds hours, rest = divmod(time_taken,3600) minutes, seconds = divmod(rest, 60)
9
поделиться
автор: Qina Yan
я посмотрел на модуль timeit, но, похоже, это только для небольших фрагментов кода. Я хочу засечь время всей программы.
$ python -mtimeit -n1 -r1 -t -s "from your_module import main" "main()"
он работает your_module.main()
функция один раз и печать прошедшего времени с помощью в качестве таймера.
эмуляция /usr/bin/time
в Python вижу подпроцесс Python с /usr/bin / time: как захватить информацию о времени, но игнорировать все остальные выходные данные?.
для измерения времени процессора (например, не включают время time.sleep()
) для каждой функции вы можете использовать profile
модуль (cProfile
на Python 2):
$ python3 -mprofile your_module. py
вы могли бы пройти -p
to timeit
команда выше, если вы хотите использовать тот же таймер, как profile
модуль использует.
посмотреть как вы можете профилировать скрипт Python?
7
поделиться
автор: jfs
Ipython «timeit» любой скрипт:
def foo(): %run bar.py timeit foo()
7
поделиться
автор: ab-user
времени.clock()
устарел с версии 3.3: поведение этой функции зависит на платформе: используйте perf_counter () или process_time() , в зависимости от ваших требований, иметь четко определенное поведение.
времени.perf_counter()
возвращает значение (в дробных секундах) счетчика производительности, т. е. часы с самым высоким доступным разрешением для измерения короткого продолжительность. Это тут включить время, прошедшее во время сна и общесистемный.
времени.process_time()
возвращает значение (в дробных секундах) суммы системы и время использования процессора для текущего процесса. Это не включить времени во время сна.
start = time.process_time() ... do something elapsed = (time.process_time() - start)
7
поделиться
автор: Yas
Просто Использовать timeit
модуль. Он работает как с Python 2, так и с Python 3
import timeit start = timeit.default_timer() #ALL THE PROGRAM STATEMETNS stop = timeit.default_timer() execution_time = stop - start print("Program Executed in "+execution_time) #It returns time in sec
он возвращается через несколько секунд, и Вы можете иметь время выполнения. Просто, но вы должны написать их в основной функции, которая запускает выполнение программы. Если вы хотите получить время выполнения, даже если вы получаете ошибку, то возьмите свой параметр «Start» и вычислите его как
def sample_function(start,**kwargs): try: #your statements Except: #Except Statements stop = timeit.default_timer() execution_time = stop - start print("Program Executed in "+execution_time)
6
поделиться
автор: Ravi Kumar
есть timeit
модуль, который может использоваться для времени выполнения кодов python.
Он имеет подробную документацию и примеры в документах python (https://docs.python.org/2/library/timeit.html)
5
поделиться
автор: Alfie
Мне тоже нравится ответ пола Макгира и придумал форму контекстного менеджера, которая больше соответствовала моим потребностям.
import datetime as dt import timeit class TimingManager(object): """Context Manager used with the statement 'with' to time some execution. Example: with TimingManager() as t: # Code to time """ clock = timeit.default_timer def __enter__(self): """ """ self.start = self.clock() self.log('\n=> Start Timing: {}') return self def __exit__(self, exc_type, exc_val, exc_tb): """ """ self.endlog() return False def log(self, s, elapsed=None): """Log current time and elapsed time if present. :param s: Text to display, use '{}' to format the text with the current time. :param elapsed: Elapsed time to display. Dafault: None, no display. """ print s.format(self._secondsToStr(self.clock())) if(elapsed is not None): print 'Elapsed time: {}\n'.format(elapsed) def endlog(self): """Log time for the end of execution with elapsed time. """ self.log('=> End Timing: {}', self.now()) def now(self): """Return current elapsed time as hh:mm:ss string. :return: String. """ return str(dt.timedelta(seconds = self.clock() - self.start)) def _secondsToStr(self, sec): """Convert timestamp to h:mm:ss string. :param sec: Timestamp. """ return str(dt.datetime.fromtimestamp(sec))
5
поделиться
автор: Gall
это ответ пола Макгира, который работает для меня. На случай, если у кого-то возникнут проблемы с управлением.
import atexit from time import clock def reduce(function, iterable, initializer=None): it = iter(iterable) if initializer is None: value = next(it) else: value = initializer for element in it: value = function(value, element) return value def secondsToStr(t): return "%d:%02d:%02d.%03d" % \ reduce(lambda ll,b : divmod(ll[0],b) + ll[1:], [(t*1000,),1000,60,60]) line = "="*40 def log(s, elapsed=None): print (line) print (secondsToStr(clock()), '-', s) if elapsed: print ("Elapsed time:", elapsed) print (line) def endlog(): end = clock() elapsed = end-start log("End Program", secondsToStr(elapsed)) def now(): return secondsToStr(clock()) def main(): start = clock() atexit. register(endlog) log("Start Program")
вызов timing.main()
из вашей программы после импорта файла.
2
поделиться
автор: Saurabh Rana
Timeit-класс в python, используемый для вычисления времени выполнения небольших блоков кода.
Default_timer-это метод в этом классе, который используется для измерения времени настенных часов, а не времени выполнения процессора. Таким образом, этому может помешать другое выполнение процесса. Таким образом, он полезен для небольших блоков кода.
пример кода выглядит следующим образом:
from timeit import default_timer as timer start= timer() #some logic end = timer() print("Time taken:", end-start)
2
поделиться
автор: Utkarsh Dhawan
использовать line_profiler.
line_profiler будет профилировать время выполнения отдельных строк кода. Профилировщик реализован в C через Cython, чтобы уменьшить накладные расходы на профилирование.
from line_profiler import LineProfiler import random def do_stuff(numbers): s = sum(numbers) l = [numbers[i]/43 for i in range(len(numbers))] m = ['hello'+str(numbers[i]) for i in range(len(numbers))] numbers = [random.randint(1,100) for i in range(1000)] lp = LineProfiler() lp_wrapper = lp(do_stuff) lp_wrapper(numbers) lp.print_stats()
результаты будут:
Timer unit: 1e-06 s Total time: 0.000649 s File: <ipython-input-2-2e060b054fea> Function: do_stuff at line 4 Line # Hits Time Per Hit % Time Line Contents ============================================================== 4 def do_stuff(numbers): 5 1 10 10.0 1.5 s = sum(numbers) 6 1 186 186.0 28.7 l = [numbers[i]/43 for i in range(len(numbers))] 7 1 453 453. 0 69.8 m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
2
поделиться
автор: Yu Jiaao
для людей данных, использующих Jupyter Notebooks
в ячейку, вы можете использовать Jupyter это %%time
волшебная команда для измерения времени выполнения:
%%time [ x**2 for x in range(10000)]
выход
Время процессора: пользователь 4.54 ms, sys: 0 ns, всего: 4.54 ms
Время стены: 4,12 МС
это будет захватывать только время выполнения конкретной ячейки. Если вы хотите записать время выполнения всего ноутбука (т. е. программы), вы можете создать новый ноутбук в тот же каталог и в новом ноутбуке выполните все ячейки:
предположим, что записная книжка выше называется example_notebook.ipynb
. В новом блокноте в том же каталоге:
# Convert your notebook to a .py script: !jupyter nbconvert --to script example_notebook. ipynb # Run the example_notebook with -t flag for time %run -t example_notebook
выход
IPython тайминги процессора (оценочные):
Пользователь: 0.00 s.
Система: 0.00 s.
Время стены: 0.00 s.
2
поделиться
автор: Matt
использовать обновленный ответ metakermit для python 2.7 вам потребуется монотонная.
код будет выглядеть следующим образом:
from datetime import timedelta from monotonic import monotonic start_time = monotonic() end_time = monotonic() print(timedelta(seconds=end_time - start_time))
1
поделиться
автор: H0R5E
время выполнения программы Python может быть несовместимым в зависимости от:
- та же программа может быть оценена с использованием различных алгоритмов
- время работы зависит от алгоритмов
- время выполнения варьируется между реализациями
- время работы варьируется между компьютерами
- время работы не предсказуемо на основе небольших входов
Это потому, что наиболее эффективным способом является использование «Порядок роста» и выучите большую нотацию «о», Чтобы сделать это правильно,https://en. wikipedia.org/wiki/Big_O_notation
в любом случае вы можете попытаться оценить производительность любой программы Python в конкретных шагах подсчета машин в секунду, используя этот простой алгоритм: адаптируйте это к программе, которую вы хотите оценить
import time now = time.time() future = now + 10 step = 4 # why 4 steps? because until here already 4 operations executed while time.time() < future: step += 3 # why 3 again? because while loop execute 1 comparison and 1 plus equal statement step += 4 # why 3 more? because 1 comparison starting while when time is over plus final assignment of step + 1 and print statement print(str(int(step / 10)) + " steps per second")
надеюсь, это поможет вам.
0
поделиться
автор: Manu
я использовал очень простую функцию для синхронизации части выполнения кода:
import time def timing(): start_time = time.time() return lambda x: print("[{:. 2f}s] {}".format(time.time() - start_time, x))
и использовать его, просто вызовите его перед кодом для измерения, чтобы получить функцию синхронизации, затем вызовите функцию после кода с комментариями, и время появится перед комментариями, например:
t = timing() train = pd.read_csv('train.csv', dtype={ 'id': str, 'vendor_id': str, 'pickup_datetime': str, 'dropoff_datetime': str, 'passenger_count': int, 'pickup_longitude': np.float64, 'pickup_latitude': np.float64, 'dropoff_longitude': np.float64, 'dropoff_latitude': np.float64, 'store_and_fwd_flag': str, 'trip_duration': int, }, parse_dates = ['pickup_datetime', 'dropoff_datetime'], ) t("Loaded {} rows data from 'train'". format(len(train)))
тогда выход будет выглядеть так:
[9.35s] Loaded 1458644 rows data from 'train'
Я чувствую себя немного элегантной таким образом.
0
поделиться
автор: Tao Wang
Точная синхронизация функций в Python [python, testing, time, profiling]
Я программирую на Python в Windows и хочу точно измерить время, необходимое для запуска функции. Я написал функцию time_it, которая принимает другую функцию, запускает ее и возвращает время, необходимое для выполнения.
def time_it(f, *args): start = time.clock() f(*args) return (time.clock() - start)*1000
Я называю это 1000 раз и усредняю результат. (константа 1000 в конце дает ответ в миллисекундах.)
Эта функция, кажется, работает, но у меня есть неприятное ощущение, что я делаю что-то не так, и что, делая это таким образом, я использую больше времени, чем функция фактически использует при ее запуске.
Есть ли более стандартный или общепринятый способ сделать это?
Когда я изменил свою тестовую функцию, чтобы вызвать печать, чтобы она занимала больше времени, моя функция time_it возвращает в среднем 2,5 мс, в то время как cProfile.run (‘f ()’) возвращает среднее значение 7,0 мс. Я подумал, что моя функция будет переоценивать время, если что-нибудь, что здесь происходит?
Еще одно замечание: меня волнует относительное время функций по сравнению друг с другом, а не абсолютное время, поскольку оно, очевидно, будет варьироваться в зависимости от оборудования и других факторов.
python testing time profiling
person Atilio Jobson schedule 20.05.2009 source источник
Ответы (7)
arrow_upward
39
arrow_downward
Вместо того, чтобы писать собственный код профилирования, я предлагаю вам проверить встроенные профилировщики Python (profile
или cProfile
, в зависимости от ваших потребностей): http://docs. python.org/library/profile.html
person Dan Lew schedule 20.05.2009
arrow_upward
69
arrow_downward
Используйте timeit
модуль из стандартной библиотеки Python.
Основное использование:
from timeit import Timer # first argument is the code to be run, the second "setup" argument is only run once, # and it not included in the execution time. t = Timer("""x.index(123)""", setup="""x = range(1000)""") print t.timeit() # prints float, for example 5.8254 # ..or.. print t.timeit(1000) # repeat 1000 times instead of the default 1million
person Alex Martelli schedule 20.05.2009
arrow_upward
33
arrow_downward
Вы можете создать декоратор «timeme» вот так
import time def timeme(method): def wrapper(*args, **kw): startTime = int(round(time. time() * 1000)) result = method(*args, **kw) endTime = int(round(time.time() * 1000)) print(endTime - startTime,'ms') return result return wrapper @timeme def func1(a,b,c = 'c',sleep = 1): time.sleep(sleep) print(a,b,c) func1('a','b','c',0) func1('a','b','c',0.5) func1('a','b','c',0.6) func1('a','b','c',1)
person vdrmrt schedule 30.08.2013
arrow_upward
24
arrow_downward
Этот код очень неточный
total= 0 for i in range(1000): start= time.clock() function() end= time.clock() total += end-start time= total/1000
Этот код менее неточен
start= time.clock() for i in range(1000): function() end= time.clock() time= (end-start)/1000
Очень неточность страдает от систематической ошибки измерения, если время выполнения функции близко к точности часов. Большинство измеренных значений времени — это просто случайные числа от 0 до нескольких тактов часов.
В зависимости от рабочей нагрузки вашей системы, «время», которое вы наблюдаете от одной функции, может быть полностью артефактом планирования ОС и других неконтролируемых накладных расходов.
Вторая версия (менее неточная) имеет меньшую погрешность измерения. Если ваша функция действительно быстрая, вам может потребоваться запустить ее 10 000 раз, чтобы уменьшить планирование ОС и другие накладные расходы.
Оба, конечно, вводят в заблуждение. Время выполнения вашей программы — в целом — не является суммой времени выполнения функции. Вы можете использовать числа только для относительных сравнений. Это не абсолютные измерения, которые несут много смысла.
person S.Lott schedule 20.05.2009
arrow_upward
14
arrow_downward
Если вы хотите рассчитать время для метода python, даже если измеряемый блок может выбросить, хороший подход — использовать оператор with
. Определите некоторый Timer
класс как
import time class Timer: def __enter__(self): self.start = time.clock() return self def __exit__(self, *args): self.end = time.clock() self.interval = self.end - self.start
Затем вы можете определить время для метода подключения, который может вызвать ошибку. Использовать
import httplib with Timer() as t: conn = httplib.HTTPConnection('google.com') conn.request('GET', '/') print('Request took %.03f sec.' % t.interval)
__exit()__
метод будет вызываться, даже если запрос на соединение не получен. Точнее, вы бы использовали try
finally
, чтобы увидеть результат, если он выдает, как с
try: with Timer() as t: conn = httplib.HTTPConnection('google.com') conn.request('GET', '/') finally: print('Request took %.03f sec.' % t.interval)
Подробнее здесь.
person kiriloff schedule 30. 08.2013
arrow_upward
7
arrow_downward
Это аккуратнее
from contextlib import contextmanager import time @contextmanager def timeblock(label): start = time.clock() try: yield finally: end = time.clock() print ('{} : {}'.format(label, end - start)) with timeblock("just a test"): print "yippee"
person JasonEdinburgh schedule 18.02.2014
arrow_upward
4
arrow_downward
Подобно ответу @ AlexMartelli
import timeit timeit.timeit(fun, number=10000)
может сделать трюк.
person Binu Jasim schedule 08.12.2016
Производительность. Как измерить прошедшее время в Python?
Задавать вопрос
Спросил
Изменено 1 месяц назад
Просмотрено 2,4 млн раз
Я хочу измерить время, необходимое для выполнения функции. Я не мог заставить работать timeit
:
import timeit начало = время.время() распечатать("привет") конец = время.время() печать (конец - начало)
- питон
- производительность
- мера
- время
1
Используйте time.time()
для измерения прошедшего времени настенных часов между двумя точками:
время импорта начало = время.время() распечатать("привет") конец = время.время() печать (конец - начало)
Время выполнения в секундах.
Другим вариантом, начиная с Python 3.3, может быть использование perf_counter
или process_time
, в зависимости от ваших требований. До версии 3.3 рекомендовалось использовать time.clock
(спасибо Amber). Однако в настоящее время он устарел:
В Unix вернуть текущее время процессора в виде числа с плавающей запятой выражается в секундах. Точность, а на самом деле само определение значения «процессорного времени», зависит от значения функции C того же имени.
В Windows эта функция возвращает количество секунд настенных часов, прошедших с момента первый вызов этой функции в виде числа с плавающей запятой на основе Функция Win32
QueryPerformanceCounter()
. Разрешение, как правило, лучше одной микросекунды.Устарело, начиная с версии 3.3 : поведение этой функции зависит на платформе: используйте
perf_counter()
илиprocess_time()
вместо , в зависимости от ваших требований, чтобы иметь четко определенное поведение.
Использовать timeit.default_timer
вместо timeit.timeit
. Первый автоматически обеспечивает лучшие часы, доступные на вашей платформе и версии Python:
из timeit импортировать default_timer как таймер
старт = таймер()
# ...
конец = таймер()
print(end - start) # Время в секундах, например 5. 380400282
timeit.default_timer назначается для time.time() или time.clock() в зависимости от ОС. В Python 3.3+ default_timer — это time.perf_counter() на всех платформах. См. Python — time.clock () против time.time () — точность?
См. также:
- Код оптимизации
- Как оптимизировать скорость
1
Поскольку time.clock()
устарел, начиная с Python 3.3, вы можете использовать time.perf_counter()
для общесистемной синхронизации или time.process_time()
для общепроцессной синхронизации, просто как вы использовали time.clock()
:
время импорта т = время.процесс_время() #сделай что-нибудь прошедшее_время = время.время_процесса() - t
Новая функция process_time
не будет включать время, прошедшее во время сна.
0
Время измерения в секундах:
из timeit импортировать default_timer как таймер из datetime импортировать timedelta старт = таймер() # . ... # (здесь работает ваш код) # ... конец = таймер() печать (timedelta (секунды = конец-начало))
Выход :
0:00:01.946339
1
Учитывая функцию, которую вы хотите вычислить по времени,
test.py:
def foo(): # напечатать "привет" верни "привет"
самый простой способ использования timeit
- вызвать его из командной строки:
% python -mtimeit -s'import test' 'test.foo()' 1000000 циклов, лучшее из 3: 0,254 мкс на цикл
Не пытайтесь использовать time.time
или time.clock
(наивно) для сравнения скорости функций. Они могут дать вводящие в заблуждение результаты.
ПС. Не помещайте операторы печати в функцию, которую вы хотите задать по времени; в противном случае измеренное время будет зависеть от скорости терминала.
0
Забавно делать это с помощью менеджера контекста, который автоматически запоминает время начала при входе в блок с
, а затем фиксирует время окончания при выходе из блока. С небольшими хитростями вы даже можете получить подсчет прошедшего времени внутри блока из той же функции менеджера контекста.
В базовой библиотеке этого нет (но, вероятно, должно быть). Оказавшись на месте, вы можете делать такие вещи, как:
с elapsed_timer() как истекшее: # какой-то длинный код print("midpoint at %.2f секунды" % elapsed() ) # время на данный момент # другой длинный код print("все сделано за %.2f секунд" % истекло() )
Вот достаточный код contextmanager:
from contextlib import contextmanager из timeit импортировать default_timer @contextmanager прошедший_таймер защиты (): запуск = таймер_по умолчанию() elapser = lambda: default_timer() — запуск выход лямбда: eplapser() конец = таймер_по умолчанию() elapser = лямбда: конец-начало
И некоторый исполняемый демонстрационный код:
время импорта с elapsed_timer() как истекшим: время сна(1) печать (истекшее()) время сна(2) печать (истекшее()) время сна(3)
Обратите внимание, что по замыслу этой функции возвращаемое значение elapsed()
замораживается при выходе из блока, и дальнейшие вызовы возвращают ту же продолжительность (около 6 секунд в этом игрушечном примере).
2
Я предпочитаю это. timeit
doc слишком запутан.
из даты и времени импорта даты и времени start_time = дата и время.сейчас() # ВСТАВЬТЕ СВОЙ КОД time_elapsed = datetime.now() - start_time print('Время истекло (чч:мм:сс.мс) {}'.format(time_elapsed))
Обратите внимание, что здесь не происходит никакого форматирования, я просто написал чч:мм:сс
в распечатке, чтобы можно было интерпретировать time_elapsed
3
Вот еще один способ сделать это:
>> from pytictoc import TicToc >> t = TicToc() # создать экземпляр TicToc >> t.tic() # Запустить таймер >> # сделать что-нибудь >> t.toc() # Вывести прошедшее время Прошедшее время составляет 2,612231 секунды.
По сравнению с традиционным способом:
>> время импорта времени >> t1 = время() >> # сделать что-нибудь >> t2 = время() >> прошло = t2 - t1 >> print('Прошедшее время: %f секунд. ' Прошло %) Прошедшее время составляет 2,612231 секунды.
Установка:
pip install pytictoc
Дополнительные сведения см. на странице PyPi.
5
Самый простой способ рассчитать продолжительность операции:
время импорта start_time = время.monotonic() <операции, программы> print('секунды:', time.monotonic() - start_time)
Официальная документация здесь.
2
Вот мои выводы после прочтения многих хороших ответов здесь, а также нескольких других статей.
Во-первых, если вы колеблетесь между timeit
и time.time
, timeit
имеет два преимущества:
-
timeit
выбирает лучший таймер, доступный для вашей ОС и версии Python. -
timeit
отключает сборку мусора, однако это не то, чего вы можете хотеть или не хотеть.
Теперь проблема в том, что timeit
не так прост в использовании, потому что его нужно настроить, и все становится ужасно, когда у вас есть куча импорта. В идеале вам просто нужен декоратор или используйте с блоком
и измеряйте время. К сожалению, для этого нет ничего встроенного, поэтому у вас есть два варианта:
Вариант 1: использовать библиотеку timebudget
Timebudget — это универсальная и очень простая библиотека, которую вы можете использовать всего в одной строке кода после pip. установить.
@timebudget # Запишите, сколько времени занимает эта функция определить мой_метод(): # мой код
Вариант 2: Используйте мой небольшой модуль
Ниже я создал небольшой служебный модуль синхронизации под названием Timing.py. Просто поместите этот файл в свой проект и начните его использовать. Единственная внешняя зависимость — это runstats, которая опять же невелика.
Теперь вы можете синхронизировать любую функцию, просто поставив перед ней декоратор:
время импорта @timing.MeasureTime определение MyBigFunc(): #сделай что-нибудь, отнимающее много времени для я в диапазоне (10000): печать (я) время. print_all_timings()
Если вы хотите синхронизировать часть кода, просто поместите ее в с блоком
:
время импорта #где-то в моем коде со временем.MeasureBlockTime("MyBlock"): #сделай что-нибудь, отнимающее много времени для я в диапазоне (10000): печать (я) # остальная часть моего кода время.print_all_timings()
Преимущества:
Существует несколько недоработанных версий, поэтому я хочу отметить несколько основных моментов:
- Используйте таймер из timeit вместо time.time по причинам, описанным ранее.
- При желании вы можете отключить сборщик мусора во время синхронизации.
- Decorator принимает функции с именованными или безымянными параметрами.
- Возможность отключить печать в блоке времени (используйте
с time.MeasureBlockTime() как t
, а затемt.elapsed
). - Возможность оставить gc включенным для синхронизации блоков.
2
Использование time. time
для измерения выполнения дает вам общее время выполнения ваших команд, включая время выполнения, затрачиваемое другими процессами на вашем компьютере. Это время, которое пользователь замечает, но не очень хорошо, если вы хотите сравнить разные фрагменты кода/алгоритмы/функции/...
Дополнительная информация о timeit
:
- Использование модуля timeit
- timeit — Время выполнения небольших фрагментов кода Python
Если вы хотите глубже понять профилирование:
- http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code
- Как можно профилировать скрипт Python?
Обновление : я много использовал http://pythonhosted.org/line_profiler/ в течение последнего года и считаю его очень полезным и рекомендую использовать его вместо модуля профиля Python.
Вот еще один менеджер контекста для кода синхронизации -
Использование:
из эталонного теста импорта с эталоном ("Тест 1+1"): 1+1 => Тест 1+1: 1. 41e-06 секунд
или, если вам нужно значение времени
с эталоном («Тест 1+1») как b: 1+1 печать (б.время) => Тест 1+1: 7.05e-07 секунд 7.05233786763э-07
Benchmark.py :
из timeit импортировать default_timer как таймер эталон класса (объект): def __init__(self, msg, fmt="%0.3g"): self.msg = сообщение селф.фмт = фмт защита __enter__(сам): self.start = таймер () вернуть себя def __exit__(я, *аргументы): t = таймер () - self.start print(("%s : " + self.fmt + " секунды") % (self.msg, t)) собственное время = т
Взято с http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html
Используйте модуль профилировщика. Это дает очень подробный профиль.
профиль импорта profile.run('основной()')
выводит что-то вроде:
5 вызовов функций за 0,047 секунды Упорядочено: стандартное имя ncalls tottime percall cumtime percall имя файла:lineno(функция) 1 0,000 0,000 0,000 0,000 :0(исполнение) 1 0,047 0,047 0,047 0,047 :0(установитьпрофиль) 1 0,000 0,000 0,000 0,000 <строка>:1(<модуль>) 0 0,000 0,000 профиль:0(профилировщик) 1 0,000 0,000 0,047 0,047 профиль:0(основной()) 1 0,000 0,000 0,000 0,000 two_sum. py:2(twoSum)
Я нашел это очень информативным.
1
Модули Python cProfile и pstats предлагают отличную поддержку для измерения времени, прошедшего в определенных функциях, без необходимости добавлять какой-либо код вокруг существующих функций.
Например, если у вас есть скрипт python timeFunctions.py:
время импорта привет (): напечатать "Привет :)" время сна (0,1) спасибо (): печатать "Спасибо!" время сна (0,05) для idx в диапазоне (10): привет() для idx в диапазоне (100): благодарю вас()
Чтобы запустить профилировщик и сгенерировать статистику для файла, вы можете просто запустить:
python -m cProfile -o timeStats.profile timeFunctions.py
При этом используется модуль cProfile для профилирования всех функций в timeFunctions.py и сбора статистики в файле timeStats.profile. Обратите внимание, что нам не нужно было добавлять какой-либо код в существующий модуль (timeFunctions. py), и это можно сделать с любым модулем.
Когда у вас есть файл статистики, вы можете запустить модуль pstats следующим образом:
python -m pstats timeStats.profile
Запускает интерактивный браузер статистики, предоставляющий множество приятных функций. Для вашего конкретного случая использования вы можете просто проверить статистику для вашей функции. В нашем примере проверка статистики для обеих функций показывает нам следующее:
Добро пожаловать в браузер статистики профиля. timeStats.profile% статистика привет <отметка времени> timeStats.profile 224 вызова функций за 6,014 секунды Был использован случайный порядок перечисления Список сокращен с 6 до 1 из-за ограничения <'hello'> ncalls tottime percall cumtime percall имя файла:lineno(функция) 10 0,000 0,000 1,001 0,100 timeFunctions.py:3(привет) timeStats.profile% статистика спасибо <отметка времени> timeStats.profile 224 вызова функций за 6,014 секунды Был использован случайный порядок перечисления Список сокращен с 6 до 1 из-за ограничения <'thankyou'> ncalls tottime percall cumtime percall имя файла:lineno(функция) 100 0,002 0,000 5,012 0,050 timeFunctions. py:7(спасибо)
Этот фиктивный пример мало что дает, но дает представление о том, что можно сделать. Самое приятное в этом подходе то, что мне не нужно редактировать какой-либо из моего существующего кода, чтобы получить эти числа и, очевидно, помочь с профилированием.
3
Вот крошечный класс таймера, который возвращает строку «чч:мм:сс»:
класс Таймер: защита __init__(сам): self.start = время.время() перезагрузка защиты (самостоятельно): self.start = время.время() защита get_time_hhmmss (я): конец = время.время() m, s = divmod(end - self.start, 60) ч, м = divmod(m, 60) time_str = "%02d:%02d:%02d" % (ч, м, с) возврат time_str
Использование:
# Запустить таймер мой_таймер = Таймер() # ... сделай что-нибудь # Получить строку времени: time_hhmmss = my_timer.get_time_hhmmss() print("Прошло время: %s" % time_hhmmss ) # ... снова использовать таймер мой_таймер. restart() # ... сделай что-нибудь # Получить время: time_hhmmss = my_timer.get_time_hhmmss() # ... так далее
1
(только с Ipython) вы можете использовать %timeit для измерения среднего времени обработки:
def foo(): напечатать "привет"
и далее:
%timeit foo()
результат примерно такой:
10000 циклов, лучшее из 3: 27 мкс на цикл
1
Мне нравится простой (python 3):
from timeit import timeit timeit(лямбда: печать("привет"))
Вывод микросекунд для однократного выполнения:
2.430883963010274
Объяснение : timeit выполняет анонимную функцию 1 миллион раз по умолчанию, и результат выдается через секунд . Следовательно, результат для 1 однократного выполнения будет таким же, но за микросекунд в среднем .
Для медленных операций добавьте меньшее число итераций, иначе вы можете ждать вечно:
время импорта timeit(лямбда: time.sleep(1.5), число=1)
Вывод всегда за секунд для всего числа итераций:
1.5015795179999714
2
на python3:
из времени импорта сна, perf_counter как ПК t0 = пк() спать(1) печать (пк () - t0)
элегантный и короткий.
2
%load_ext змеиная визуализация %%snakeviz
Он просто берет эти 2 строки кода в блокноте Jupyter и создает красивую интерактивную диаграмму. Например:
Вот код. Опять же, 2 строки, начинающиеся с %
, являются единственными дополнительными строками кода, необходимыми для использования змеиной визуализации:
# !pip установить снейквиз %load_ext змеиная визуализация импортировать глобус импортировать хеш-библиотеку %%snakeviz файлы = glob. glob('*.txt') def print_files_hashed (файлы): для файла в файлах: с открытым (файл) как f: print(hashlib.md5(f.read().encode('utf-8')).hexdigest()) print_files_hashed(файлы)
Возможно также запустить змеиную визуализацию вне ноутбуков. Больше информации на сайте змеи.
0
Еще один способ использования timeit:
from timeit import timeit Функция определения(): вернуть 1 + 1 время = время (функция, число = 1) печать (время) 9123 t2 = время.время() печать (t2-t1)
7.9870223994e-05
1
Вот довольно хорошо документированный и полностью типизированный декоратор, который я использую в качестве общей утилиты:
из functools import wraps со времени импорта perf_counter от ввода import Any, Callable, Optional, TypeVar, cast F = TypeVar("F",bound=Callable[..., Any]) def timer (префикс: Необязательный [str] = Нет, точность: int = 6) -> Вызываемый [[F], F]: """Используйте в качестве декоратора для определения времени выполнения любой функции. Аргументы: префикс: строка для печати до истечения времени. По умолчанию это имя функции. точность: сколько десятичных знаков включать в значение секунд. Примеры: >>> @таймер() ... определение foo(x): ... вернуть х >>> фоо(123) фу: 0,000... с 123 >>> @timer("Затраченное время: ", 2) ... определение foo(x): ... вернуть х >>> фоо(123) Затраченное время: 0,00 с 123 """ def decorator(func: F) -> F: @обертывания (функция) def wrapper(*args: Any, **kwargs: Any) -> Any: нелокальный префикс prefix = префикс, если префикс не None else f"{func.__name__}: " старт = perf_counter() результат = функция (* аргументы, ** kwargs) конец = perf_counter() print(f"{prefix}{конец - начало:.{точность}f}s") вернуть результат возвратное литье (F, обертка) вернуться декоратор
Пример использования:
из таймера импорта таймера @таймер (точность = 9) def take_long(x: int) -> bool: вернуть x в (i для i в диапазоне (x + 1)) результат = принимает_долго(10**8) печать (результат)
Выход:
занимает_долго: 4,942629056 с Истинный
Доктесты можно проверить с помощью:
$ python3 -m doctest --verbose -o=ELLIPSIS timer. py
И тип намекает на:
$ mypy timer.py
3
Очень поздний ответ, но, возможно, кому-то он пригодится. Это способ сделать это, который я считаю очень чистым.
время импорта def timed(fun, *args): с = время.время() г = весело (*аргументы) print('{} выполнение заняло {} секунд.'.format(fun.__name__, time.time()-s)) возврат (г) timed(печать, "Привет")
Имейте в виду, что «печать» — это функция в Python 3, а не в Python 2.7. Однако он работает с любой другой функцией. Ваше здоровье!
2
Если вы хотите иметь возможность удобного времени функций, вы можете использовать простой декоратор:
время импорта определение time_decorator (функция): обертка def (*args, **kwargs): начало = время.perf_counter() original_return_val = func(*args, **kwargs) конец = время.perf_counter() print("прошедшее время в", func. __name__, ": ", end-start, sep='') вернуть original_return_val возвратная упаковка
Вы можете использовать его для функции, которую вы хотите синхронизировать, например:
@timing_decorator определение function_to_time(): время сна(1) function_to_time()
Каждый раз, когда вы вызываете function_to_time
, он будет печатать, сколько времени это заняло, и имя функции, для которой выполняется синхронизация.
2
Вы можете использовать timeit.
Вот пример того, как протестировать naive_func, который принимает параметр, используя Python REPL:
>>> import timeit >>> определение наивной_функции (х): ... а = 0 ... для i в диапазоне (a): ... а += я ... вернуть >>> def wrapper(func, *args, **kwargs): ... деф обертка(): ... return func(*args, **kwargs) ... возвратная обертка >>> обернутый = обертка (naive_func, 1_000) >>> timeit.timeit(обернутый, число=1_000_000) 0,4458435332577161
Вам не нужна функция-оболочка, если у функции нет параметров.
1
Функция print_elapsed_time ниже
def print_elapsed_time (префикс = ''): e_time = время.время() если не hasattr(print_elapsed_time, 's_time'): print_elapsed_time.s_time = e_time еще: print(f'{prefix} прошедшее время: {e_time - print_elapsed_time.s_time:.2f} sec') print_elapsed_time.s_time = e_time
используйте его таким образом
print_elapsed_time() ....тяжелые работы... print_elapsed_time('после тяжелой работы') ....тонны рабочих мест... print_elapsed_time('после тонны заданий')
результат
после выполнения тяжелых работ время: 0,39 сек. после тонны заданий прошло время: 0,60 сек.
плюсы и минусы этой функции в том, что вам не нужно передавать время начала
Мы также можем преобразовать время в удобочитаемое время.
время импорта, дата и время начало = время.часы() определение num_multi1 (макс.): результат = 0 для числа в диапазоне (0, 1000): если (число % 3 == 0 или число % 5 == 0): результат += число напечатать "Сумма %d" % результат num_multi1 (1000) конец = время. часы() значение = конец - начало отметка времени = datetime.datetime.fromtimestamp (значение) печать timestamp.strftime('%Y-%m-%d %H:%M:%S')
Хотя в вопросе это строго не задано, довольно часто требуется простой и унифицированный способ постепенного измерения времени, прошедшего между несколькими строками кода.
Если вы используете Python 3.8 или более позднюю версию, вы можете использовать выражения присваивания (также известные как оператор walrus), чтобы добиться этого довольно элегантным способом:
время импорта начало, раз = time.perf_counter(), {} распечатать("привет") times["print"] = -start + (start := time.perf_counter()) время сна(1.42) times["sleep"] = -start + (start := time.perf_counter()) a = [n**2 для n в диапазоне (10000)] раз["pow"] = -start + (start := time.perf_counter()) печать (раз)
=>
{'печать': 2.1934504375e-05, 'сон': 1.4210970401763916, 'мощность': 0.005671024322509766}
Я сделал для этого библиотеку, если вы хотите измерить функцию, вы можете просто сделать это так
из импорта pythonbenchmark сравнить, измерить время импорта а, б, в, г, д = 10,10,10,10,10 что-то = [а, б, в, г, д] @мера def myFunction (что-то): время сна (0,4) @мера def myOptimizedFunction (что-то): время сна (0,2) моя функция (ввод) мояОптимизированнаяФункция(ввод)
https://github. com/Karlheinzniebuhr/pythonbenchmark
Этот уникальный подход на основе классов предлагает печатное строковое представление, настраиваемое округление и удобный доступ к прошедшему времени в виде строки или числа с плавающей запятой. Он был разработан с помощью Python 3.7.
импорт даты и времени импортировать время класс Таймер: """Измерение использованного времени.""" # Ссылка: https://stackoverflow.com/a/57931660/ def __init__(self, round_ndigits: int = 0): self._round_ndigits = round_ndigits self._start_time = timeit.default_timer() def __call__(self) -> float: время возвратаit.default_timer() - self._start_time def __str__(я) -> ул: return str(datetime.timedelta(seconds=round(self(), self._round_ndigits)))
Использование:
# Настройка таймера >>> таймер = Таймер() # Доступ в виде строки >>> print(f'Время истекло {timer}.') Прошедшее время 0:00:03. >>> print(f'Время истекло {timer}.') Прошедшее время 0:00:04. # Доступ как поплавок >>> таймер() 6.841332235 >>> таймер() 7.970274425
1
Как узнать время выполнения программы Python?
Задавать вопрос
Спросил
Изменено 1 месяц назад
Просмотрено 2,1 млн раз
У меня есть программа командной строки на Python, выполнение которой занимает некоторое время. Я хочу знать точное время, которое требуется, чтобы закончить бег.
Я просмотрел модуль timeit
, но, похоже, он предназначен только для небольших фрагментов кода. Я хочу засечь всю программу.
- питон
- время
- время выполнения
0
Самый простой способ в Python:
время импорта start_time = время. время() главный() print("--- %s секунд ---" % (time.time() - start_time))
Это предполагает, что ваша программа запускается как минимум за десятую долю секунды.
Печать:
--- 0,7648869 секунд ---
9
Я поместил этот модуль Timing.py
в свой собственный каталог site-packages
и просто вставил время импорта
вверху моего модуля:
импорт atexit часы импорта времени определение секундToStr(t): вернуть "%d:%02d:%02d.%03d" % \ уменьшить (лямбда ll, b : divmod (ll [0], b) + ll [1:], [(t*1000,),1000,60,60]) строка = "="*40 журнал деф (с, прошедшее = нет): линия печати печатать секундыToStr(часы()), '-', с если прошло: напечатать «Прошедшее время:», истекшее линия печати Распечатать деф эндлог(): конец = часы() прошедшее = конец-начало log("Завершить программу", secondToStr(истекшее)) определить сейчас(): вернуть секундыToStr(часы()) начало = часы () atexit. register(endlog) лог("Запустить программу")
Я также могу вызвать time.log
из своей программы, если в программе есть важные этапы, которые я хочу показать. Но просто включение синхронизации импорта
напечатает время начала и окончания, а также общее прошедшее время. (Простите мою малоизвестную функцию secondsToStr
, она просто форматирует число секунд с плавающей запятой в форму чч:мм:сс.ссс.)
Примечание. Версию приведенного выше кода для Python 3 можно найти здесь или здесь.
7
В Linux или Unix:
$ time python yourprogram.py
В Windows см. этот вопрос StackOverflow: Как измерить время выполнения команды в командной строке Windows?
Для более подробного вывода
$ time -v python yourprogram.py Время выполнения команды: «python3 yourprogram.py» Время пользователя (секунды): 0,08 Системное время (секунды): 0,02 Процент загрузки процессора этой работой: 98% Прошедшее (настенные часы) время (ч:мм:сс или м:сс): 0:00,10 Средний размер общего текста (кбайт): 0 Средний размер нераспределенных данных (кбайт): 0 Средний размер стека (кбайт): 0 Средний общий размер (кбайт): 0 Максимальный размер резидентного набора (кбайт): 9480 Средний размер резидентного набора (кбайт): 0 Основные (требующие ввода-вывода) ошибки страницы: 0 Незначительные (восстановление кадра) ошибки страницы: 1114 Произвольные переключения контекста: 0 Непроизвольные переключения контекста: 22 Свопы: 0 Входы файловой системы: 0 Выходы файловой системы: 0 Отправлено сообщений через сокет: 0 Получено сообщений через сокет: 0 Доставлено сигналов: 0 Размер страницы (байт): 4096 Статус выхода: 0
4
Мне нравится вывод, который предоставляет модуль datetime
, где объекты дельты времени показывают дни, часы, минуты и т. д. по мере необходимости в удобочитаемом виде.
Например:
из даты и времени импорта даты и времени start_time = дата и время.сейчас() # делай свою работу здесь end_time = дата/время.сейчас() print('Продолжительность: {}'.format(end_time - start_time))
Образец вывода, например.
Продолжительность: 0:00:08.309267
или
Продолжительность: 1 день, 1:51:24.269711
Как упомянул Дж. Ф. Себастьян, этот подход может столкнуться с некоторыми сложными случаями с местным временем, поэтому его безопаснее использовать:
время импорта из datetime импортировать timedelta start_time = время.monotonic() end_time = время.monotonic() печать (timedelta (секунды = конечное_время - начальное_время))
3
время импорта start_time = время.часы() главный() print(time.clock() - start_time, "секунды")
time.clock()
возвращает время процессора, что позволяет нам рассчитать только время, используемое этим процессом (по крайней мере, в Unix). В документации говорится: «В любом случае, эту функцию следует использовать для тестирования Python или алгоритмов синхронизации»
. 3
Мне очень нравится ответ Пола Макгуайра, но я использую Python 3. Итак, для тех, кому интересно: вот модификация его ответа, которая работает с Python 3 на * nix (я думаю, под Windows, что clock()
следует использовать вместо time()
):
#python3 импортировать атексит из времени импорта времени, strftime, локальное время из datetime импортировать timedelta def секундToStr (истекшее время = нет): если истекло None: return strftime("%Y-%m-%d %H:%M:%S", localtime()) еще: вернуть строку (timedelta (секунды = прошедшее)) журнал деф (с, прошедшее = нет): строка = "="*40 печать (строка) печать (secondsToStr(), '-', с) если прошло: print("Прошедшее время:", истекшее) печать (строка) Распечатать() деф эндлог(): конец = время () прошедшее = конец-начало log("Завершить программу", secondToStr(истекшее)) начало = время () atexit. register(endlog) лог("Запустить программу")
Если вы сочтете это полезным, вы все равно должны проголосовать за его ответ, а не за этот, так как он проделал большую часть работы ;).
7
Вы можете использовать cProfile профилировщика Python для измерения времени ЦП и, кроме того, сколько времени тратится внутри каждой функции и сколько раз вызывается каждая функция. Это очень полезно, если вы хотите улучшить производительность своего скрипта, не зная, с чего начать. Этот ответ на другой вопрос о переполнении стека довольно хорош. Также всегда полезно заглянуть в документацию.
Вот пример того, как профилировать скрипт с помощью cProfile из командной строки:
$ python -m cProfile euler048.py 1007 вызовов функций за 0,061 секунды ЦП Упорядочено: стандартное имя ncalls tottime percall cumtime percall имя файла:lineno(функция) 1 0,000 0,000 0,061 0,061 <строка>:1(<модуль>) 1000 0,051 0,000 0,051 0,000 euler048. py:2(<лямбда>) 1 0,005 0,005 0,061 0,061 euler048.py:2(<модуль>) 1 0,000 0,000 0,061 0,061 {исполняемый файл} 1 0,002 0,002 0,053 0,053 {карта} 1 0.000 0.000 0.000 0.000 {метод 'отключить' объектов '_lsprof.Profiler} 1 0,000 0,000 0,000 0,000 {диапазон} 1 0,003 0,003 0,003 0,003 {сумма}
2
Просто используйте модуль timeit
. Он работает как с Python 2, так и с Python 3.
import timeit start = timeit.default_timer() # Все операторы программы стоп = timeit.default_timer() время_исполнения = стоп-старт print("Программа выполнена за "+str(execution_time)) # Возвращает время в секундах
Он возвращается в секундах, и вы можете получить время выполнения. Это просто, но вы должны написать их в основной функции, которая запускает выполнение программы. Если вы хотите получить время выполнения, даже когда вы получаете ошибку, возьмите свой параметр «Старт» и рассчитайте там, например:
определение функции_образца (начало, ** kwargs): пытаться: # Ваши заявления кроме: # операторы exclude запускаются, когда ваши операторы вызывают исключение стоп = timeit. default_timer() время_исполнения = стоп-старт print("Программа выполнена в " + str(время_выполнения))
1
время.часы()
Устарело, начиная с версии 3.3: поведение этой функции зависит на платформе: используйте perf_counter() или process_time() вместо этого, в зависимости от ваших требований, чтобы иметь четко определенное поведение.
time.perf_counter()
Возвращает значение (в долях секунды) счетчика производительности, то есть часы с самым высоким доступным разрешением для измерения короткого продолжительность. включает в себя время, прошедшее во время сна, и общесистемный.
время.процесс_время()
Возвращает значение (в долях секунды) суммы системы и пользовательское процессорное время текущего процесса. Это не включает прошедшее время во время сна.
начало = время.процесс_время() ... сделай что-нибудь прошедшее = (time.process_time() - начало)
1
time.clock
объявлен устаревшим в Python 3.3 и будет удален из Python 3.8: используйте time.perf_counter
или time.process_time
вместо
время импорта start_time = время.perf_counter () для x в диапазоне (1, 100): печать (х) end_time = time.perf_counter () print(end_time - start_time, "секунды")
0
Для пользователей данных, использующих Jupyter Notebook
В ячейке вы можете использовать волшебную команду Jupyter %%time
для измерения времени выполнения:
%%time [ x**2 для x в диапазоне (10000)]
Выход
Процессорное время: пользователь 4,54 мс, системный: 0 нс, всего: 4,54 мс Время стены: 4,12 мс
Будет фиксироваться только время выполнения конкретной ячейки. Если вы хотите зафиксировать время выполнения всей записной книжки (т. е. программы), вы можете создать новую записную книжку в том же каталоге и в новой записной книжке выполнить все ячейки:
Предположим, указанная выше записная книжка называется example_notebook. ipynb
. В новом блокноте в том же каталоге:
# Преобразуйте свой блокнот в сценарий .py: !jupyter nbconvert --в скрипт example_notebook.ipynb # Запускаем example_notebook с флагом -t для времени %run -t пример_блокнота
Вывод
Тайминги процессора IPython (приблизительно): Пользователь: 0,00 с. Система : 0,00 с. Время стены: 0,00 с.
Следующий фрагмент выводит прошедшее время в удобном для восприятия человеком формате <ЧЧ:ММ:СС>
.
время импорта из datetime импортировать timedelta start_time = время.время() # # Выполнить множество вычислений. # прошедшее_время_секунд = время.время() - время начала msg = "Выполнение заняло: %s секунд (время настенных часов)" % timedelta(seconds=round(elapsed_time_secs)) печать (сообщение)
1
Подобно ответу @rogeriopvl, я добавил небольшую модификацию для преобразования в часы, минуты, секунды, используя ту же библиотеку для длительных заданий.
время импорта start_time = время.время() главный() секунды = время.время() - время_начала print('Затраченное время:', time.strftime("%H:%M:%S",time.gmtime(секунды)))
Образец вывода
Затраченное время: 00:00:08
1
Для функций я предлагаю использовать этот простой декоратор, который я создал.
определение времени (метод): def timed(*args, **kwargs): тс = время.время() результат = метод (* аргументы, ** kwargs) te = время.время() если 'log_time' в kwargs: name = kwargs.get('log_name', method.__name__.upper()) kwargs['log_time'][имя] = int((te - ts) * 1000) еще: print('%r %2.22f мс' % (метод.__name__, (te - ts) * 1000)) вернуть результат возвращение по времени @timeit деффу(): поработай немного() # Фу() # 'фу' 0.000953 мс
3
от времени импорта времени время_начала = время() . .. время окончания = время() time_taken = end_time - start_time # time_taken в секундах часы, отдых = divmod(time_taken,3600) минуты, секунды = divmod(остальное, 60)
Я просмотрел модуль timeit, но, похоже, он предназначен только для небольших фрагментов кода. Я хочу засечь всю программу.
$ python -mtimeit -n1 -r1 -t -s "из вашего_модуля импортировать основной" "основной()"
Работает your_module.main()
функция один раз и распечатать прошедшее время, используя функцию time.time()
в качестве таймера.
Чтобы эмулировать /usr/bin/time
в Python, см. Подпроцесс Python с /usr/bin/time: как получить информацию о времени, но игнорировать все остальные выходные данные?.
Чтобы измерить время процессора (например, не включать время в течение time.sleep()
) для каждой функции, вы можете использовать модуль profile
( cProfile
на Python 2):
$ python3 -mprofile your_module . py
Вы можете передать -p
команду timeit
выше, если хотите использовать тот же таймер, что и модуль профиля
.
См. Как профилировать скрипт Python?
У меня была та же проблема во многих местах, поэтому я создал удобный пакет horology
. Вы можете установить его с помощью pip install horology
, а затем сделать это элегантным способом:
из horology import Timing. with Timing(name='Важные расчеты:'): подготовить() делай_ваши_вещи() Finish_sth()
выведет:
Важные вычисления: 12,43 мс
Или еще проще (если у вас есть одна функция):
из часового импорта по времени @время деф основной(): ...
будет выводить:
основной: 7,12 ч
Учитывает единицы и округление. Он работает с Python 3.6 или новее.
4
Мне тоже понравился ответ Пола Макгуайра, и я придумал форму диспетчера контекста, которая больше соответствовала моим потребностям.
импорт даты и времени как DT импортировать время класс TimingManager (объект): """Диспетчер контекста используется с оператором with для определения времени выполнения. Пример: с TimingManager() как t: # Код времени """ часы = timeit.default_timer защита __enter__(сам): """ """ self.start = self.часы () self.log('\n=> Время начала: {}') вернуть себя def __exit__(self, exc_type, exc_val, exc_tb): """ """ self.endlog() вернуть ложь журнал защиты (я, с, прошедшее = нет): """Запишите текущее время и прошедшее время, если они есть. :param s: Текст для отображения, используйте '{}' для форматирования текста с помощью текущее время. :param elapsed: Прошедшее время для отображения. По умолчанию: Нет, нет отображения. """ напечатать s.format (self._secondsToStr (self.clock ())) если (прошедшее не равно None): print 'Прошедшее время: {}\n'. format(истекшее) деф эндлог(я): """Зарегистрируйте время окончания выполнения с прошедшим временем. """ self.log('=> Время окончания: {}', self.now()) определить сейчас (я): """Возвращает текущее прошедшее время в виде строки чч:мм:сс. :возврат: Строка. """ вернуть строку (dt.timedelta (секунды = self.clock () - self.start)) def _secondsToStr(я, сек): """Преобразовать метку времени в строку ч:мм:сс. :param sec: Отметка времени. """ вернуть строку (dt.datetime.fromtimestamp (сек))
В IPython "timeit" любой скрипт:
def foo(): %run bar.py время это foo ()
1
Я использовал очень простую функцию для определения времени выполнения части кода:
время импорта определение времени(): start_time = время.время() вернуть лямбда x: print("[{:.2f}s] {}".format(time.time() - start_time, x))
И чтобы использовать его, просто вызовите его перед кодом для измерения, чтобы получить время функции, а затем вызовите функцию после кода с комментариями. Время появится перед комментариями. Например:
т = синхронизация() поезд = pd.read_csv('train.csv', дтип = { 'идентификатор': ул, 'vendor_id': ул, 'pickup_datetime': ул, 'dropoff_datetime': ул, 'количество_пассажиров': целое, 'pickup_longitude': np.float64, 'pickup_latitude': np.float64, 'dropoff_longitude': np.float64, 'dropoff_latitude': np.float64, 'store_and_fwd_flag': ул, 'trip_duration': целое, }, parse_dates = ['pickup_datetime', 'dropoff_datetime'], ) t("Загружены данные {} строк из 'train'".format(len(train)))
Тогда вывод будет выглядеть так:
[9,35 с] Загружено 1458644 строки данных из «поезда»
0
Я попробовал и нашел разницу во времени, используя следующие скрипты.
время импорта start_time = время.perf_counter() [основной код здесь] print (time.perf_counter() - start_time, "секунды")
1
Использовать line_profiler.
line_profiler профилирует время выполнения отдельных строк кода. Профилировщик реализован на C через Cython, чтобы уменьшить накладные расходы на профилирование.
из line_profiler импортировать LineProfiler импортировать случайный деф do_stuff (числа): с = сумма (числа) l = [числа [i]/43 для i в диапазоне (len (числа))] m = ['hello'+str(numbers[i]) для i в диапазоне(len(numbers))] числа = [random.randint(1,100) для i в диапазоне(1000)] lp = LineProfiler() lp_wrapper = lp(делаем_вещи) lp_wrapper (числа) lp.print_stats()
Результаты будут следующими:
Единица таймера: 1e-06 с Общее время: 0,000649 с Файл:Функция: do_stuff в строке 4 Строка № совпадений Время на попадание % времени Содержимое строки ================================================== ============ 4 def do_stuff(числа): 5 1 10 10,0 1,5 с = сумма (числа) 6 1 186 186,0 28,7 l = [числа[i]/43 для i в диапазоне(len(числа))] 7 1 453 453,0 69. 8 m = ['hello'+str(numbers[i]) для i в диапазоне(len(numbers))]
1
Timeit — это класс Python, используемый для расчета времени выполнения небольших блоков кода.
Default_timer — это метод этого класса, который используется для измерения времени настенных часов, а не времени выполнения ЦП. Таким образом, выполнение другого процесса может помешать этому. Таким образом, это полезно для небольших блоков кода.
Пример кода выглядит следующим образом:
from timeit import default_timer as timer старт = таймер () # Немного логики конец = таймер() print("Затраченное время:", конец-начало)
0
Сначала установите дружественный к человеку пакет, открыв командную строку (CMD) от имени администратора и набрав там - pip install humanfriendly
Код:
from humanfriendly import format_timespan время импорта начало_время = время. время() # Поместите сюда свой код конечное_время = время.время() - начало_время print("Общее время выполнения: ", format_timespan(end_time))
Вывод:
Вы делаете это просто в Python. Не нужно усложнять.
время импорта начало = время.местное время() конец = время.местное время() """Общее время выполнения в минутах$ """ печать (конец.tm_min - начало.tm_min) """Общее время выполнения в секундах$ """ печать (конец.tm_sec - начало.tm_sec)
1
Ответить позже, но я использую встроенный timeit
:
import timeit код_к_тесту = """ а = диапазон (100000) б = [] для я в: б. добавить (я * 2) """ elapsed_time = timeit.timeit (code_to_test, число = 500) печать (прошедшее_время) # 10.159821493085474
- Оберните весь свой код, включая любой импорт, который у вас может быть, внутри
code_to_test
. -
число
Аргумент указывает, сколько раз должен повторяться код. - Демо
3
Существует модуль timeit
, который можно использовать для измерения времени выполнения кода Python.
Подробная документация и примеры в документации Python, 26.6. timeit — Измерение времени выполнения небольших фрагментов кода .
1
Следуя этому ответу создал простой, но удобный инструмент.
время импорта из datetime импортировать timedelta def start_time_measure (сообщение = нет): если сообщение: распечатать (сообщение) время возврата.monotonic() def end_time_measure (start_time, print_prefix = None): end_time = время.monotonic() если print_prefix: print(print_prefix + str(timedelta(seconds=end_time - start_time))) вернуть конечное_время
Использование:
total_start_time = start_time_measure() start_time = start_time_measure('Делаем что-то. ..') # Сделай что-нибудь end_time_measure(start_time, 'Выполнено через:') start_time = start_time_measure('Делаю что-то еще...') # Сделайте что-нибудь еще end_time_measure(start_time, 'Выполнено через:') end_time_measure(total_start_time, 'Общее время:')
Вывод:
Что-то делать... Выполнено в: 0:00:01.218000 Делать что-то другое... Выполнено в: 0:00:01.313000 Общее время: 0:00:02.672000
Это ответ Пола Макгуайра, который мне подходит. На всякий случай, если у кого-то возникли проблемы с запуском этого.
импорт атэкзит часы импорта времени def уменьшить (функция, итерируемый, инициализатор = нет): это = итер (повторяемый) если инициализатор None: значение = следующее (оно) еще: значение = инициализатор для элемента в нем: значение = функция (значение, элемент) возвращаемое значение определение секундToStr(t): вернуть "%d:%02d:%02d.%03d" % \ уменьшить (лямбда ll, b : divmod (ll [0], b) + ll [1:], [(t*1000,),1000,60,60]) строка = "="*40 журнал деф (с, прошедшее = нет): печать (строка) печать (secondsToStr(часы()), '-', с) если прошло: печать ("Прошедшее время:", истекло) печать (строка) деф эндлог(): конец = часы() прошедшее = конец-начало log("Завершить программу", secondToStr(истекшее)) определить сейчас(): вернуть секундыToStr(часы()) деф основной(): начало = часы () atexit. register(endlog) лог("Запустить программу")
Вызовите time.main()
из вашей программы после импорта файла.
Время выполнения программы Python может быть непоследовательным в зависимости от:
- Одна и та же программа может оцениваться с использованием разных алгоритмов
- Время работы зависит от алгоритма
- Время работы зависит от реализации
- Время работы зависит от компьютера
- Время работы непредсказуемо из-за небольших входных данных
Это потому, что наиболее эффективным способом является использование "Порядка роста" и выучить нотацию с большой буквой "О", чтобы сделать это правильно.
В любом случае, вы можете попробовать оценить производительность любой программы на Python на конкретных машинах, считая шаги в секунду, используя этот простой алгоритм: адаптируйте это к программе, которую вы хотите оценить
время импорта сейчас = время.время() будущее = сейчас + 10 step = 4 # Почему 4 шага? Потому что до сих пор выполнено уже четыре операции в то время как time. time() <будущее: step += 3 # Почему снова 3? Потому что цикл while выполняет одно сравнение и одно выражение «плюс-равно». шаг += 4 # Зачем еще 3? Потому что одно сравнение начинается, когда время истекло, плюс окончательное назначение шага + 1 и оператор печати print(str(int(step/10)) + " шагов в секунду")
Функция измерения времени Python Ru Python
Изменено 10 месяцев назад
Просмотрено 221k раз
Я хочу создать функцию Python, чтобы проверить время, затрачиваемое на каждую функцию, и вывести ее имя с указанием времени, как я могу напечатать имя функции и если есть другой способ сделать это, пожалуйста, скажите мне
def MeasureTime (а): начало = время.часы() а() прошедшее = время.часы() прошедшее = прошедшее - начало print "Время, проведенное в (имя функции): ", истекло
- питон
- время
- обратный вызов
3
Прежде всего, я настоятельно рекомендую использовать профилировщик или, по крайней мере, timeit.
Однако, если вы хотите написать свой собственный метод синхронизации исключительно для обучения, вот где можно начать использовать декоратор.
Python 2:
определение времени (f): защита обертки (*аргументы): время1 = время.время() рет = f(*аргументы) время2 = время.время() print '%s функция заняла %0.3f мс' % (f.func_name, (time2-time1)*1000.0) вернуться обратно обратная упаковка
Использование очень простое, просто используйте декоратор @timing:
@timing определение do_work(): #код
Python 3:
определение времени (f): def wrap(*args, **kwargs): время1 = время.время() рет = f(*args, **kwargs) время2 = время.время() print('{:s} функция заняла {:.3f} мс'.format(f.__name__, (time2-time1)*1000.0)) вернуться обратно обратная упаковка
Примечание. Я вызываю f.func_name
, чтобы получить имя функции в виде строки (в Python 2) или f. __name__
в Python 3.
7
Поиграв с модулем timeit
, мне не нравится его интерфейс, который не так элегантен по сравнению со следующими двумя способами.
Следующий код находится в Python 3.
Метод декоратора
Это почти то же самое, что и метод @Mike. Здесь я добавляю kwargs
и functools
wrap, чтобы сделать его лучше.
время по умолчанию (функция): @functools.wraps(func) def new_func(*args, **kwargs): start_time = время.время() результат = функция (* аргументы, ** kwargs) прошедшее_время = время.время() - время начала print('функция [{}] завершена в {} мс'.format( func.__name__, int(истекшее_время * 1_000))) вернуть результат вернуть new_func @timeit деффубар(): Майк = Человек() майк.думаю(30)
Метод менеджера контекста
из contextlib import contextmanager @contextmanager определение timeit_context (имя): start_time = время. время() урожай прошедшее_время = время.время() - время начала print('[{}] завершено в {} мс'.format(name, int(elapsed_time * 1_000)))
Например, вы можете использовать его как:
с timeit_context('Мой код профилирования'): Майк = Человек() майк.думай()
И код внутри блока с
будет синхронизирован.
Заключение
Используя первый способ, вы можете легко закомментировать декоратор, чтобы получить нормальный код. Однако он может только синхронизировать функцию. Если у вас есть какая-то часть кода, которую вы не можете сделать функцией, вы можете выбрать второй метод.
Например, теперь у вас есть
изображений = get_images() big_image = ImagePacker.pack(изображения, ширина=4096) ящик.draw(big_image)
Теперь вы хотите рассчитать время строки big_image = ...
. Если вы измените его на функцию, это будет:
изображений = get_images() big_image = Нет @timeit деффубар(): нелокальный big_image big_image = ImagePacker. pack(изображения, ширина=4096) ящик.draw(big_image)
Выглядит не очень хорошо... Что, если вы используете Python 2, в котором нет ключевого слова nonlocal
.
Вместо этого здесь очень хорошо подходит использование второго метода:
images = get_images() с timeit_context('foobar'): big_image = ImagePacker.pack(изображения, ширина=4096) ящик.draw(big_image)
4
Я не понимаю, в чем проблема с модулем timeit
. Это, пожалуй, самый простой способ сделать это.
время импорта timeit.timeit (а, число = 1)
Также можно отправлять аргументы функциям. Все, что вам нужно, это обернуть вашу функцию с помощью декораторов. Дополнительные пояснения здесь: http://www.pythoncentral.io/time-a-python-function/
Единственный случай, когда вам может быть интересно написать свои собственные операторы синхронизации, - это если вы хотите запустить функцию только один раз и также хотите получить его возвращаемое значение.
Преимущество использования модуля timeit
заключается в том, что он позволяет повторять количество выполнений. Это может быть необходимо, потому что другие процессы могут повлиять на точность синхронизации. Таким образом, вы должны запустить его несколько раз и посмотреть на наименьшее значение.
1
Timeit имеет два больших недостатка: он не возвращает возвращаемое значение функции и использует eval, который требует передачи дополнительного кода настройки для импорта. Это решает обе проблемы просто и элегантно:
определение времени (f): начало = время.время() возврат = f () прошедшее = время.время() - начало возврат рет, истекший timed (лямбда: database.foo.execute ('выберите количество (*) из source.apachelog')) (<объект sqlalchemy.engine.result.ResultProxy по адресу 0x7fd6c20fc690>, 4.07547402381897)
2
Есть простой инструмент для хронометража. https://github.com/RalphMao/PyTimer
Он может работать как декоратор :
из таймера импорта pytimer @Таймер (среднее = Ложь) def matmul(a,b, раз=100): для я в диапазоне (раз): нп.точка (а, б)
Вывод:
матмуль:0.368434 матмул: 2.839355
Он также может работать как подключаемый модуль таймера с контролем пространства имен (полезно, если вы вставляете его в функцию, которая имеет много кодов и может быть вызвана где угодно).
таймер = Таймер() определить любую_функцию(): таймер.старт() для я в диапазоне (10): таймер.сброс() np.dot (np.ones ((100 1000)), np.zeros ((1000 500))) timer.checkpoint('block1') np.dot (np.ones ((100 1000)), np.zeros ((1000 500))) np.dot (np.ones ((100 1000)), np.zeros ((1000 500))) timer.checkpoint('блок2') np.dot (np.ones ((100,1000)), np.zeros ((1000,1000))) для j в диапазоне (20): np.dot (np.ones ((100 1000)), np. zeros ((1000 500))) таймер.резюме() для я в диапазоне (2): любая_функция()
Выход:
========Временная сводка таймера по умолчанию======== блок 2: 0,065062 блок1:0.032529 ========Сводка по таймеру по умолчанию======== блок2: 0,065838 блок1:0.032891
Надеюсь, это поможет
Метод декоратора с использованием библиотеки декоратора Python:
import decorator @декоратор def time(func, *args, **kwargs): '''Временная оболочка функции Пример использования: ``@время()`` ''' fn = '%s.%s' % (функция__модуль__, функция__имя__) таймер = Таймер() с таймером: ret = func(*args, **kwargs) log.info(u'%s - %0.3f sec' % (fn, timer.duration_in_seconds())) вернуться обратно
См. пост в моем блоге:
пост в блоге mobilepro.pl
мой пост в Google Plus
Мой способ сделать это:
from time import time def printTime (начало): конец = время () продолжительность = конец - начало если продолжительность < 60: return "используется:" + str(round(duration, 2)) + "s. " еще: мин = интервал (длительность / 60) сек = раунд (длительность% 60, 2) если мин < 60: return "используется:" + str(mins) + "m" + str(secs) + "s." еще: часы = интервал (длительность / 3600) мин = мин % 60 return "использовано:" + str(часы) + "h" + str(минуты) + "m" + str(secs) + "s."
Установите переменную как start = time()
перед выполнением функции/циклов и printTime(start)
сразу после блока.
и вы получили ответ.
Вспоминая @Jonathan Ray Я думаю, что это немного лучше
время импорта импортный осмотр def timed (f: callable): начало = время.время() возврат = f () прошедшее = 1000*(время.время() - начало) source_code=inspect.getsource(f).strip('\n') logger.info(source_code+": "+str(истекшее)+" секунд") вернуться обратно
Позволяет взять обычную строку кода, скажем, a = np.sin(np.pi)
и довольно просто преобразовать ее в
a = timed(lambda: np. sin(np.pi))
, чтобы синхронизация печаталась в регистраторе, и вы могли сохранить то же самое назначение результата переменной, которая может понадобиться вам для дальнейшей работы.
Я полагаю, что в Python 3.8 можно было бы использовать :=
, но у меня пока нет 3.8
1
Ниже приведен класс Timer, который:
- Простота в использовании: используйте непосредственно или как функцию декоратора, < 100 строк
- Измеряет многое: общее количество вызовов, общее время, среднее время и станд. отклонение.
- Печатает красивое время
- Резьбовой
Вот как это использовать:
# Создать таймер timer1 = Таймер("имя", log_every=2) # Использовать с" с таймером1: печать("таймер1") # Повторное использование в качестве декоратора @таймер1 защита my_func(): печать ("моя_функция") # Создать как декоратор @Timer("другой таймер", log_every=1) защита my_func2(): печать ("my_func2") моя_функция() моя_функция2() моя_функция()
Ниже приведен класс
из datetime import datetime время импорта, ведение журнала, математика, многопоточность класс Таймер (объект): '''Общий класс таймера. Это действительно не место в файле judicata здесь.''' def __init__(я, имя, log_every = 1): self.name = имя self.log_every = 1 селф.звонки = 0 self.total_time = 0 self.total_squared_time = 0 self.min, self.max = нет, 0 # Сделать таймер потокобезопасным, сохраняя время в локальной памяти потока. self._local = threading.local() self._lock = многопоточность.Lock() защита __enter__(сам): """Запустить новый таймер""" self._local.start = datetime.utcnow() def __exit__(self, exc_type, exc_val, exc_tb): """Остановите таймер и сообщите прошедшее время""" elapsed_time = (datetime.utcnow() - self._local.start).total_seconds() с self._lock: самостоятельные вызовы += 1 self.total_time += прошедшее_время если self.min == None или elapsed_time < self.min: self.min = прошедшее_время если elapsed_time > self.max: self. max = прошедшее_время self.total_squared_time += истекшее_время * истекшее_время если self.log_every и (self.calls % self.log_every) == 0: self.log() def __call__(я, фн): '''Для использования в качестве декоратора'''. def decor_timer_function(*args, **kwargs): с собой: вернуть fn(*args, **kwargs) вернуть украшенную_таймерную_функцию @классметод def time_str (cls, сек): если isinstance(secs, six.string_types): пытаться: сек = число с плавающей запятой (сек) кроме: return "(плохое время: %s)"%secs знак = лямбда х: х если сек < 0: сек = -сек знак = лямбда х: ("-" + х) return sign("%d secs"%int(secs) if secs >= 120 else "%.2f secs" % сек, если сек >= 1 иначе "%d ms" % int(secs * 1000), если sec >= .01 иначе "%.2f мс" % (сек * 1000), если сек >= . 0001 иначе "%d ns" % int(secs * 1000 * 10000), если sec >= 1e-9еще "%s" % сек) журнал защиты (я): если не self.calls: logging.info("<Таймер %s: звонков нет>"%self.name) возвращаться среднее = 1,0 * self.total_time / self.calls var = 1.0 * self.total_squared_time / self.calls - avg*avg std_dev = self.time_str(math.sqrt(var)) итог = self.time_str(self.total_time) min, max, avg = [self.time_str(t) для t в [self.min, self.max, avg]] logging.info("<Таймер %s: N=%s, total=%s, avg=%s, min/max=%s/%s, std=%s>" %(self.name, self.calls, всего, avg, min, max, std_dev))
Вы можете использовать timeit.default_timer
вместе с contextmanager
:
из timeit import default_timer из контекстного менеджера импорта контекста @contextmanager таймер определения(): start_time = default_timer() пытаться: урожай в конце концов: print("--- %s секунд ---" % (default_timer() - start_time))
Используйте его с с оператором
:
def looper(): для я в диапазоне (0, 100000000): проходить с таймером(): петлитель ()
Вывод:
--- 2,6515267998 секунд ---
Вот общее решение
def timed(fn): # убедитесь, что где бы вы это ни использовали, импорт будет готов со времени импорта perf_counter импорт из functools # wraps сохраняет метаданные fn @обертки(fn) def внутренний (*args, **kwargs): старт = perf_counter() результат = fn(*args, **kwargs) конец = perf_counter() прошедшее = конец - начало args_ = [str(a) для a в args] kwargs_ = ["{0}={1}". format(k, v) для (k, v) в kwargs.items()] all_args = args_ + kwargs_ args_str = ",".join(all_args) print("{0} ({1}) запустил {2:.6f}.".format(fn.__name__, args_str, истек)) вернуть результат вернуться внутрь
определить функцию:
@timed def sum_up (а, б): вернуть а+б
теперь назовите это:
sum_up(2,9)
Для случая использования timeit.timeit
, если команда
timeit.timeit(function_to_test, n=10000)
поднять ошибку ValueError: stmt не является ни строкой, ни вызываемой
или командой
timeit.timeit('function_to_test', n=10000)
поднять ошибку имя 'function_to_test' не определено
, тогда вам нужно:
заменить function_to_test
или 'function_to_test'
на str(function_to_test)
, то есть
timeit.timeit(str(function_to_0test0), 0n
или, если версия Python >= 3. 6, другим способом является использование строки f как
timeit.timeit(f'{function_to_test}', n=10000)
О версии используйте лямбду, то есть timeit.timeit(lambda: function_to_test, n=10000)
, это работает, но, судя по моему тесту, это занимает гораздо больше времени.
Вот конкретный пример:
время импорта определение function_to_test(n): с = 1 для я в диапазоне (n): с += 1 вернуть с print("время запуска function_to_test: ", timeit.timeit(str(function_to_test(1000000)), число=10000)) print("время запуска function_to_test: ", timeit.timeit(f'{function_to_test(1000000)}', number=10000))
Твой ответ
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
точно измерить время, которое занимает функция python
Asked
Изменено 2 года, 9 месяцев назад
Просмотрено 37k раз
Мне нужно измерить время выполнения определенных частей моей программы (не для отладки, а как функция в выводе). Точность важна, потому что общее время будет составлять доли секунды.
Собирался использовать модуль time, когда наткнулся на timeit, который претендует на избежать ряда распространенных ловушек для измерения времени выполнения . К сожалению, у него ужасный интерфейс, принимающий в качестве входных данных строку, которую затем обрабатывает.
Итак, мне нужно использовать этот модуль для точного измерения времени, или времени будет достаточно? И о каких подводных камнях идет речь?
Спасибо
- python
- time
- профилирование
- timeit
2
Согласно документации Python, это связано с точностью функции времени в разных операционных системах:
Функция таймера по умолчанию — платформа зависимый. В Windows time.clock() имеет микросекундную гранулярность, но Детализация time.time() составляет 1/60 от Второй; в Unix time.clock() имеет 1/100 секунды детализации и time. time() гораздо точнее. На любая платформа, таймер по умолчанию функции измеряют время настенных часов, а не процессорное время. Это означает, что др. процессы, работающие на одном компьютере может мешать таймингу... В Unix можно используйте time.clock() для измерения времени процессора.
Для прямого извлечения из timeit.py
code:
if sys.platform == "win32": # В Windows лучшим таймером является time.clock() default_timer = время.часы еще: # На большинстве других платформ лучшим таймером является time.time() default_timer = время.время
Кроме того, он касается непосредственно настройки исполняемого кода. Если вы используете время
, вы должны сделать это самостоятельно. Это, конечно, экономит ваше время
Настройка Timeit:
по определению внутренний (_it, _timer): #Ваш код установки %(настройка)s _t0 = _таймер() для _i в _it: #Код, который вы хотите синхронизировать %(stmt)s _t1 = _таймер() вернуть _t1 - _t0
Python 3:
Начиная с Python 3. 3 вы можете использовать time.perf_counter()
(общесистемное время) или time.process_time()
(общепроцессное время), точно так же, как вы использовали время .clock()
:
из времени импорта process_time т = время_процесса() #сделай что-нибудь прошедшее_время = время_процесса() - t
Новая функция process_time
не будет включать время, прошедшее во время сна.
Python 3.7+:
Начиная с Python 3.7 вы также можете использовать process_time_ns()
, который похож на process_time()
, но возвращает время в наносекундах.
6
Вы можете создать временной контекст (см. PEP 343) для довольно простого измерения блоков кода.
из __future__ import with_statement время импорта класс Таймер (объект): защита __enter__(сам): self.__start = время.время() def __exit__(я, тип, значение, трассировка): # Здесь обработка ошибок self. __finish = время.время() определение продолжительность_in_seconds (я): вернуть self.__finish - self.__start таймер = Таймер() с таймером: # Все, что вы хотите измерить, идет сюда время сна(2) печать timer.duration_in_seconds()
1
Модуль timeit выглядит так, как будто он предназначен для тестирования производительности алгоритмов, а не для простого мониторинга приложения. Ваш лучший вариант, вероятно, - использовать модуль времени, вызвать time.time()
в начале и в конце интересующего вас сегмента и вычесть два числа. Имейте в виду, что в полученном числе может быть гораздо больше знаков после запятой, чем фактическое разрешение системного таймера.
1
Меня тоже раздражал ужасный интерфейс timeit, поэтому я сделал для этого библиотеку, проверьте ее тривиальное использование
из импорта pythonbenchmark сравнить, измерить время импорта а, б, в, г, д = 10,10,10,10,10 что-то = [а, б, в, г, д] def myFunction (что-то): время сна (0,4) def myOptimizedFunction (что-то): время сна (0,2) # сравнительный тест сравнить (моя функция, моя оптимизированная функция, 10, ввод) # без ввода сравнить (моя функция, моя оптимизированная функция, 100)
https://github. com/Karlheinzniebuhr/pythonbenchmark
0
Вы проверили функциональность предоставленного профиля или cProfile?
http://docs.python.org/library/profile.html
Это дает гораздо более подробную информацию, чем просто печать времени до и после вызова функции. Может стоит посмотреть...
1
В документации также упоминается, что time.clock() и time.time() имеют разное разрешение в зависимости от платформы. В Unix time.clock() измеряет время процессора, а не время настенных часов.
время также отключает сборку мусора при выполнении тестов, что, вероятно, не то, что вам нужно для производственного кода.
Я считаю, что time.time() достаточно для большинства целей.
Начиная с версии Python 2.6 во времени это больше не ограничивается входной строкой. Ссылаясь на документацию:
Изменено в версии 2.6: параметры stmt и setup теперь также могут принимать объекты, которые можно вызывать без аргументов. Это встроит их вызовы в функцию таймера, которая затем будет выполняться функцией timeit(). Обратите внимание, что временные затраты в этом случае немного больше из-за дополнительных вызовов функций.
Твой ответ
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Как измерить прошедшее время в Python?
В Python мы можем измерить время, затраченное на выполнение сегмента кода или сценария Python, используя некоторые встроенные модули Python. Здесь мы рассмотрим использование time , timeit и datetime модуль.
Использование модуля Python timeit для измерения затраченного времени в Python
Модуль Python timeit часто используется для измерения времени выполнения небольших фрагментов кода. Мы также можем использовать функцию timeit(), которая выполняет анонимную функцию с несколькими запусками. Он временно отключает сборку мусора при расчете времени выполнения.
Пример 1: анализ использования модуля timeit
В этом примере мы проанализируем, как использовать модуль timeit и с его помощью найдем время выполнения лямбда-выражения. Код начинается с импорта модуля timeit, а затем мы используем функцию timeit() из модуля, чтобы найти время выполнения функции.
Python3
|
Output:
Hello World! Привет, мир! Привет, мир! Привет, мир! Привет, мир! ... 1,632629341998836 сек.
Объяснение: Приведенный выше сегмент кода будет печатать «Hello World» 1000000 раз (поскольку значение параметра number по умолчанию равно 1000000). В конце код напечатает время выполнения данного сегмента кода, измеренное в секундах.
Пример 2: Использование timeit.timeit() с предопределенными параметрами
В этом примере мы напишем сегмент кода Python, содержащий функцию, вызовем ее в виде строки и передадим в функцию timeit.timeit(). Мы будем использовать предопределенное количество итераций для подсчета времени выполнения.
Python3
|
Вывод:
1,118 сек.
Пояснения: В этом примере мы определили функцию Python и вызов функции, все записано в виде строкового представления. Мы тестируем время выполнения кода 10**6 раз и распечатываем время, затраченное на выполнение данной функции в секундах.
Пример 3: Как измерить прошедшее время с помощью timeit.repeat
Мы используем метод timeit.repeat() вместо timeit.timeit(), который принимает параметр повторения и избавляет вас от необходимости создавать цикл и сохранять значения в массиве. Это помогает получить среднее значение истекшего времени при многократном выполнении одного и того же сегмента кода.
Python3
|
Выход:
Случай 1: Затраченное время: 4,41 мкс Случай 2: Затраченное время: 3,15 мкс Случай 3: Затраченное время: 3,07 мкс Случай 4: Затраченное время: 3,04 мкс Случай 5: Затраченное время: 3,08 мкс
Пример 4.
Как измерить прошедшее время с помощью timeit.default_timer()timeit.default_timer() использует timeit.perf_counter() для записи метки времени экземпляра в наносекундах, и мы может вычесть время окончания из времени начала, чтобы получить продолжительность времени выполнения в наносекундах.
Python3
. 0014 |
Вывод:
Прошедшее время: 1,266 мкс
Использование модуля времени Python для измерения прошедшего времени в Python
мы рассмотрели использование следующих методов: time.perf_counter() , time.time_ns() , time.process_time() , time.time()
Пример 1: Как измерить прошедшее время используя time.perf_counter()
Метод time. perf_counter() записывает время в секундах. Поскольку наша примерная функция очень проста, нам нужно преобразовать ее в микросекунды, чтобы получить значение разницы во времени в удобочитаемом формате.
Python3
|
Выходные:
141420SEUTPER:
.Пример 2: Как измерить прошедшее время с помощью time.time_ns()
Чтобы измерить прошедшее время или время выполнения блока кода в наносекундах, мы можем использовать функцию time.time_ns(). Это следует тому же синтаксису, что и функция time.time(), например запись времени до и после строк кода, а затем вычитание значений и вывод их на экран, но запись производится в наносекундах, а не в секундах.
Python3
|
Вывод:
Затраченное время 2671 нс
Пример 3. Как измерить прошедшее время с помощью time.process_time()
Функция time.process_time() возвращает сумму системного и пользовательского процессорного времени . Это следует тому же синтаксису, что и функция time.time(), например запись времени до и после строк кода, затем вычитание значений, а затем вывод их на экран.
Python3
|
.
Используя модуль даты и времени Python для измерения прошедшего времени в Python
, мы также можем использовать модуль даты и времени Python, мы также можем записывать время и находить время выполнения блока кода. Процесс аналогичен использованию time.time(), измерению времени начала и окончания, а затем вычислению разницы.
Пример: как измерить прошедшее время с помощью datetime.datetime.now()
Python3
|
Вывод:
Прошло 12,0 мкс
Как проверить время выполнения скрипта Python?
В этой статье мы обсудим, как проверить время выполнения скрипта Python.
В Python существует множество модулей Python, таких как модуль time, timeit и datetime, которые могут хранить время выполнения определенного раздела программы. Манипулируя или получая разницу между временем начала и окончания выполнения определенного раздела, мы можем рассчитать время, необходимое для выполнения раздела.
Для вычисления разницы во времени можно использовать следующие методы:
- Модуль времени Python предоставляет различные функции, связанные со временем. Этот модуль относится к стандартным служебным модулям Python. метод time.time() модуля Time используется для получения времени в секундах с начала эпохи. Обработка високосных секунд зависит от платформы.
- Модуль Python datetime определяет функцию, которая в основном может использоваться для получения текущего времени и даты. функция now() Возвращает текущую локальную дату и время, которые определены в модуле datetime.
- Python Модуль timeit запускает фрагмент кода n раз (значение по умолчанию — 1000000), чтобы получить статистически наиболее релевантное измерение времени выполнения кода. 9-3. Мы можем проверить время, увеличив количество вычислений с использованием тех же алгоритмов.
Python3
import
time
start
=
time. time()
a
=
0
for
i
в
диапазон
(
1000
):
a
+
=
(i
*
*
100
)
end
=
time.time()
print
(
"The time of execution of above program is :"
,
(end
-
start)
*
10
*
*
3
,
"MS"
)
Выход:
. Время выполнения вышеупомянутой программы: 0,77056867 9003
. Время выполнения вышеупомянутой программы: 0,77056867 9003
. сегмент кода путем суммирования времени, необходимого на итерацию
Проверка времени выполнения программы для различного количества вычислений. Мы видим общую тенденцию к увеличению времени вычислений при увеличении числа выполнений. Однако он может не показывать какой-либо линейный тренд или фиксированные приращения.
Python3
import
time
for
j
in
range
(
100
,
5501
,
100
):
СТАРТ
=
Время ()
A
=
A
=
0
A
=
0
A
=
A
=
A
=
A0014
for
i
in
range
(j):
a
+
=
(i
*
*
100
)
END
=
Время ()
0013 (f
"Итерация: {j}\tЗатраченное время: {(конец-начало)*10**3:. 03f} мс"
)
Выход:
3 Итерация: 100 Затраченное время: 0,105 мс Итерация: 200 Затраченное время: 0,191 мс Итерация: 300 Затраченное время: 0,291 мс Итерация: 400 Затраченное время: 0,398 мс Итерация: 500 Затраченное время: 0,504 мс Итерация: 600 Затраченное время: 0,613 мс Итерация: 700 Затраченное время: 0,791 мс ... Итерация: 5400 Затраченное время: 6,504 мс Итерация: 5500 Затраченное время: 6,630 мс
Объяснение: Здесь мы усекли вывод для наглядности. Но если мы сравним итерации от 100 до 700, то они меньше 1 мс. Но ближе к концу цикла каждая итерация занимает ~ 7 мс. Таким образом, время увеличивается по мере увеличения количества итераций. Обычно это связано с тем, что внутренний цикл повторяется большее количество раз в зависимости от каждой внешней итерации.
Использование модуля DateTime для проверки времени выполнения
Использование модуля datetime в Python и функции datetime. now() для записи отметки времени начала и окончания экземпляра и поиска разницы для получения времени выполнения кода.
Python3
from
datetime
import
datetime
start
=
datetime.now()
a
=
0
для
I
в
.0013 =
(I
*
*
100
)
END
=
DATETIME.NOW ()
DATETIME.NOW ()
.
-
Start) . total_Seconds ()
*
10
*
*
3
Печать
(F
9003Print
(F
9003. 03f}мс"
)
. . Этот модуль предоставляет простой способ найти время выполнения небольших фрагментов кода Python. Он предоставляет метод timeit() , чтобы сделать то же самое. Функция модуля timeit.timeit(stmt, setup, timer, number) принимает четыре аргумента:
- stmt — утверждение, которое вы хотите измерить; по умолчанию это «пройти».
- setup — это код, который вы запускаете перед запуском stmt; по умолчанию это «пройти». Обычно мы используем это для импорта необходимых модулей для нашего кода.
- таймер, который является объектом timeit.Timer; обычно имеет разумное значение по умолчанию, так что вам не о чем беспокоиться.
- Число, которое представляет собой количество выполнений, которые вы хотели бы запустить stmt.
Пример 1. Использование timeit во фрагменте кода Python для измерения времени выполнения
Python3
import
timeit
mysetup
=
"from math import sqrt"
mycode
=
exec_time
=
timeit.timeit(stmt
4 3 =0003
setup
=
mysetup,
number
=
1000000
)
*
10
*
*
3
print
(f
«Время выполнения вышеуказанной программы: {exec_time:. 03f} мс»
)
Вывод:
Время выполнения вышеуказанной программы: 71,161 мс
Пример 2: Использование timeit из командной строки для измерения времени выполнения
Мы можем измерить время, затрачиваемое простыми операторами кода без необходимости писать новые файлы Python, используя timeit CLI-интерфейс.
time поддерживает различные входные данные командной строки. Здесь мы отметим несколько наиболее распространенных аргументов:
- -s [–setup] : Код установки для запуска перед выполнением оператора кода.
- -n [–число ]: количество раз выполнения инструкции.
- – p [–process] : Измерьте время выполнения кода вместо времени настенных часов.
- Заявление : Операторы кода для проверки времени выполнения, взятые в качестве позиционного аргумента.
timeit Оператор командной строки:
python -m timeit -s "import random" "l = [x**9 for x in range(random.