Подтвердить что ты не робот

Как измерить время выполнения алгоритмов в python

Возможные дубликаты:
Точная синхронизация функций в python
точное измерение функции времени python принимает

Как я могу измерить и сравнить время выполнения моих алгоритмов, написанных на python. Также укажите мне хороший сайт/форум алгоритмов, например stackoverflow, если вы можете.

4b9b3361

Ответ 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, в зависимости от того, как долго код должен работать.