тайм-аут против декодера времени

Я пытаюсь ввести код. Сначала я использовал декоратор времени:

#!/usr/bin/env python import time from itertools import izip from random import shuffle def timing_val(func): def wrapper(*arg, **kw): '''source: http://www.daniweb.com/code/snippet368.html''' t1 = time.time() res = func(*arg, **kw) t2 = time.time() return (t2 - t1), res, func.__name__ return wrapper @timing_val def time_izip(alist, n): i = iter(alist) return [x for x in izip(*[i] * n)] @timing_val def time_indexing(alist, n): return [alist[i:i + n] for i in range(0, len(alist), n)] func_list = [locals()[key] for key in locals().keys() if callable(locals()[key]) and key.startswith('time')] shuffle(func_list) # Shuffle, just in case the order matters alist = range(1000000) times = [] for f in func_list: times.append(f(alist, 31)) times.sort(key=lambda x: x[0]) for (time, result, func_name) in times: print '%s took %0.3fms.' % (func_name, time * 1000.) 

доходность

  • В Python, как отображать текущее время в читаемом формате
  • Как мне получить время выполнения программы Python?
  • Как я могу анализировать временные интервалы свободного текста в Python, начиная с нескольких лет?
  • смещение времени питона
  • Округление до 30 минут в python
  • Высокоточные часы в Python
  •  % test.py time_indexing took 73.230ms. time_izip took 122.057ms. 

    И здесь я использую timeit:

     % python - m timeit - s '' 'alist=range(1000000);[alist[i:i+31] for i in range(0, len(alist), 31)]' 10 loops, best of 3: 64 msec per loop % python - m timeit - s 'from itertools import izip' 'alist=range(1000000);i=iter(alist);[x for x in izip(*[i]*31)]' 10 loops, best of 3: 66.5 msec per loop 

    Используя timeit, результаты практически одинаковы, но с использованием time_indexing времени появляется time_indexing быстрее, чем time_izip .

    Что объясняет это различие?

    Следует ли верить тому или другому методу?

    Если да, то какой?

  • точно измерять функцию времени python
  • Как проверить разницу в секундах между двумя датами?
  • Верхний предел в Python time.sleep ()?
  • В Python, как отображать текущее время в читаемом формате
  • Python: «глобальное имя« время »не определено»
  • Как вы вычисляете время выполнения программы в python?
  • 6 Solutions collect form web for “тайм-аут против декодера времени”

    Использовать тайм-аут. Выполнение теста более одного раза дает мне гораздо лучшие результаты.

     func_list=[locals()[key] for key in locals().keys() if callable(locals()[key]) and key.startswith('time')] alist=range(1000000) times=[] for f in func_list: n = 10 times.append( min( t for t,_,_ in (f(alist,31) for i in range(n)))) for (time,func_name) in zip(times, func_list): print '%s took %0.3fms.' % (func_name, time*1000.) 

    ->

     <function wrapper at 0x01FCB5F0> took 39.000ms. <function wrapper at 0x01FCB670> took 41.000ms. 

    Используйте обертывание из functools чтобы улучшить ответ Мэтта Алькока.

     from functools import wraps from time import time def timing(f): @wraps(f) def wrap(*args, **kw): ts = time() result = f(*args, **kw) te = time() print 'func:%r args:[%r, %r] took: %2.4f sec' % \ (f.__name__, args, kw, te-ts) return result return wrap 

    В примере:

     @timing def f(a): for _ in range(a): i = 0 return -1 

    Вызов метода f завернутый в @timing :

     func:'f' args:[(100000000,), {}] took: 14.2240 sec f(100000000) 

    Преимущество этого заключается в том, что он сохраняет атрибуты исходной функции; то есть метаданные, такие как имя функции и docstring, будут правильно сохранены в возвращаемой функции.

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

     import time def timeit(f): def timed(*args, **kw): ts = time.time() result = f(*args, **kw) te = time.time() print 'func:%r args:[%r, %r] took: %2.4f sec' % \ (f.__name__, args, kw, te-ts) return result return timed 

    Использование декоратора легко использовать аннотации.

     @timeit def compute_magic(n): #function definition #.... 

    Или переименовать функцию, которую вы хотите использовать.

     compute_magic = timeit(compute_magic) 

    Я устал from __main__ import foo , теперь использую это – для простых args, для которых% r работает, а не в Ipython.
    (Почему timeit работает только на строки, а не на thunks / closures, т.е. timefunc (f, произвольные args)?)

     import timeit def timef( funcname, *args, **kwargs ): """ timeit a func with args, eg for window in ( 3, 31, 63, 127, 255 ): timef( "filter", window, 0 ) This doesn't work in ipython; see Martelli, "ipython plays weird tricks with __main__" in Stackoverflow """ argstr = ", ".join([ "%r" % a for a in args]) if args else "" kwargstr = ", ".join([ "%s=%r" % (k,v) for k,v in kwargs.items()]) \ if kwargs else "" comma = ", " if (argstr and kwargstr) else "" fargs = "%s(%s%s%s)" % (funcname, argstr, comma, kwargstr) # print "test timef:", fargs t = timeit.Timer( fargs, "from __main__ import %s" % funcname ) ntime = 3 print "%.0f usec %s" % (t.timeit( ntime ) * 1e6 / ntime, fargs) #............................................................................... if __name__ == "__main__": def f( *args, **kwargs ): pass try: from __main__ import f except: print "ipython plays weird tricks with __main__, timef won't work" timef( "f") timef( "f", 1 ) timef( "f", """ ab """ ) timef( "f", 1, 2 ) timef( "f", x=3 ) timef( "f", x=3 ) timef( "f", 1, 2, x=3, y=4 ) 

    Добавлено: см. Также «ipython играет странные трюки с основным », Martelli в run-doctests-through-ipython

    Просто предположить, но может ли разница быть величиной разницы в значениях range ()?

    Из исходного источника:

     alist=range(1000000) 

    С вашего примера timeit :

     alist=range(100000) 

    Для чего это стоит, вот результаты моей системы с диапазоном в 1 миллион:

     $ python -V Python 2.6.4rc2 $ python -m timeit -s 'from itertools import izip' 'alist=range(1000000);i=iter(alist);[x for x in izip(*[i]*31)]' 10 loops, best of 3: 69.6 msec per loop $ python -m timeit -s '' 'alist=range(1000000);[alist[i:i+31] for i in range(0, len(alist), 31)]' 10 loops, best of 3: 67.6 msec per loop 

    Мне не удалось запустить ваш другой код, так как я не мог импортировать модуль «decorator» в свою систему.


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

     $ ./test.py time_indexing took 84.846ms. time_izip took 132.574ms. 

    Спасибо, что опубликовали этот вопрос; Сегодня я чему-то научился. знак равно

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

    Python - лучший язык программирования в мире.