timeit по сравнению с синхронизацией декоратора

С точки зрения алгоритма это довольно просто. Каждый цвет представляет точку в трехмерном пространстве, а разница между цветами - это расстояние между этими точками.

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

Просто для удовольствия вы можете взглянуть на онлайн-тест цветового зрения X-rite .

55
задан unutbu 14 June 2014 в 05:19
поделиться

4 ответа

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

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.
19
ответ дан 7 November 2019 в 07:15
поделиться

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

0
ответ дан 7 November 2019 в 07:15
поделиться

Мне надоел из __main__ import foo , теперь используйте это - для простых аргументов, для которых работает% r, а не в Ipython.
(Почему timeit работает только со строками, а не с переходами / замыканиями, т.е. timefunc (f, произвольные аргументы)?)


import timeit

def timef( funcname, *args, **kwargs ):
    """ timeit a func with args, e.g.
            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", """ a b """ )
    timef( "f", 1, 2 )
    timef( "f", x=3 )
    timef( "f", x=3 )
    timef( "f", 1, 2, x=3, y=4 )

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

8
ответ дан 7 November 2019 в 07:15
поделиться

Just a guess, but could the difference be the order of magnitude of difference in range() values?

From your original source:

alist=range(1000000)

From your timeit example:

alist=range(100000)

For what it's worth, here are the results on my system with the range set to 1 million:

$ 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

I wasn't able to get your other code to run, since I could not import the "decorator" module on my system.


Update - I see the same discrepancy you do when I run your code without the decorator involved.

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

Thanks for posting this question; I learned something today. =)

2
ответ дан 7 November 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: