Как измерить время выполнения алгоритмов в python
Возможные дубликаты:
Точная синхронизация функций в python
точное измерение функции времени python принимает
Как я могу измерить и сравнить время выполнения моих алгоритмов, написанных на python. Также укажите мне хороший сайт/форум алгоритмов, например stackoverflow, если вы можете.
Ответы
Ответ 1
Я не уверен на 100%, что подразумевается под "временем выполнения моих алгоритмов, написанных на python", поэтому я подумал, что могу попытаться более подробно рассмотреть некоторые из возможных ответов.
-
Алгоритмы не имеют времени выполнения; реализации могут быть синхронизированы, но алгоритм является абстрактным подходом к тому, чтобы что-то делать. Наиболее распространенной и часто наиболее важной частью оптимизации программы является анализ алгоритма, обычно использующий асимптотический анализ и вычисление большой O сложность во времени, пространстве, использовании диска и т.д.
Компьютер не может действительно сделать этот шаг для вас. Это требует математики, чтобы понять, как что-то работает. Оптимизация этой стороны вещей является основным компонентом масштабируемой производительности.
-
Вы можете потратить время на свою конкретную реализацию. Самый лучший способ сделать это в Python - использовать timeit. Как представляется, наиболее желательно использовать модуль с функцией, инкапсулирующей то, что вы хотите вызвать, и вызывать ее из командной строки с помощью python -m timeit ...
.
Использование timeit для сравнения нескольких фрагментов при выполнении микрооптимизации, но часто это не правильный инструмент, который вы хотите сравнить с двумя разными алгоритмами. Обычно то, что вы хотите, это асимптотический анализ, но возможно, вам нужны более сложные типы анализа.
-
Вы должны знать, что время. Большинство фрагментов не стоит улучшать. Вам нужно внести изменения там, где они действительно учитываются, особенно когда вы делаете микро-оптимизацию и не улучшаете асимптотическую сложность вашего алгоритма.
Если вы в четыре раза увеличиваете скорость функции, в которой ваш код тратит 1% времени, это не реальное ускорение. Если вы повышаете скорость на 20% на функцию, в которой ваша программа тратит 50% времени, вы получаете реальный выигрыш.
Чтобы определить время, потраченное реальной программой Python, используйте stdlib профилирующие утилиты. Это скажет вам, где в примере программы ваш код тратит свое время.
Ответ 2
Модуль timeit
полезен для этого и включен в стандартный дистрибутив Python.
Пример:
import timeit
timeit.Timer('for i in xrange(10): oct(i)').timeit()
Ответ 3
Для небольших алгоритмов вы можете использовать модуль timeit
из документации python:
def test():
"Stupid test function"
L = []
for i in range(100):
L.append(i)
if __name__=='__main__':
from timeit import Timer
t = Timer("test()", "from __main__ import test")
print t.timeit()
Менее точно, но все же можно использовать время модуля следующим образом:
from time import time
t0 = time()
call_mifuntion_vers_1()
t1 = time()
call_mifunction_vers_2()
t2 = time()
print 'function vers1 takes %f' %(t1-t0)
print 'function vers2 takes %f' %(t2-t1)
Ответ 4
Использование декоратора для измерения времени выполнения для функций может быть удобно. Пример: http://www.zopyx.com/blog/a-python-decorator-for-measuring-the-execution-time-of-methods.
Ниже я бесстыдно приклеил код с сайта, упомянутого выше, чтобы этот пример существовал в SO, если сайт был удален из сети.
import time
def timeit(method):
def timed(*args, **kw):
ts = time.time()
result = method(*args, **kw)
te = time.time()
print '%r (%r, %r) %2.2f sec' % \
(method.__name__, args, kw, te-ts)
return result
return timed
class Foo(object):
@timeit
def foo(self, a=2, b=3):
time.sleep(0.2)
@timeit
def f1():
time.sleep(1)
print 'f1'
@timeit
def f2(a):
time.sleep(2)
print 'f2',a
@timeit
def f3(a, *args, **kw):
time.sleep(0.3)
print 'f3', args, kw
f1()
f2(42)
f3(42, 43, foo=2)
Foo().foo()
//Джон
Ответ 5
Язык программирования не имеет значения; измерение сложности выполнения алгоритма работает одинаково независимо от языка. Анализ алгоритмов Stanford на Университет Google Code - очень хороший ресурс для обучения себя тому, как анализировать сложность алгоритмов и кода во время выполнения.
Если все, что вы хотите сделать, это измерение прошедшего времени, которое потребовалось для выполнения функции или раздела кода на Python, вы можете использовать timeit или time, в зависимости от того, как долго код должен работать.