Вот мои выводы после того, как я прочитал здесь много хороших ответов, а также несколько других статей.
Во-первых, если вы спорите между timeit
и time.time
, у timeit
есть два преимущества:
timeit
выбирает лучший таймер, доступный для вашей ОС и версии Python.
timeit
отключает сборку мусора, однако это не то, что вам нужно или не нужно.
Теперь проблема в том, что timeit
не так просто использовать, потому что он требует настройки, и все становится некрасиво, когда у вас есть куча импорта. В идеале вам просто нужен декоратор или используйте with
блок и измеряйте время. К сожалению, для этого нет ничего встроенного, поэтому у вас есть два варианта:
Вариант 1. Используйте библиотеку бюджета времени
timebudget - это универсальная и очень простая библиотека, которую можно использовать всего в одной строке кода после установки pip.
@timebudget # Record how long this function takes
def my_method():
# my code
Вариант 2. Используйте мой небольшой модуль
Ниже я создал небольшой служебный модуль синхронизации под названием Timing.py . Просто перетащите этот файл в свой проект и начните им пользоваться. Единственная внешняя зависимость - это runstats, опять же небольшого размера.
Теперь вы можете задать время для любой функции, просто поставив перед ней декоратор:
import timing
@timing.MeasureTime
def MyBigFunc():
#do something time consuming
for i in range(10000):
print(i)
timing.print_all_timings()
Если вы хотите отследить часть кода, просто поместите ее в блок with
:
import timing
#somewhere in my code
with timing.MeasureBlockTime("MyBlock"):
#do something time consuming
for i in range(10000):
print(i)
# rest of my code
timing.print_all_timings()
Преимущества:
Есть несколько полуобеспеченных версий, поэтому я хочу выделить несколько основных моментов:
- Используйте таймер из timeit вместо time.time по причинам, описанным ранее.
- Вы можете отключить сборщик мусора на время, если хотите.
- Декоратор принимает функции с именованными или безымянными параметрами.
- Возможность отключения печати во время блока (используйте
with timing.MeasureBlockTime() as t
, а затем t.elapsed
).
- Возможность держать gc включенным для синхронизации блока.
person
Shital Shah
schedule
12.09.2018