Сроки Python - должен быть лучший способ! - PullRequest
3 голосов
/ 12 ноября 2010

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

M = 1000 # number of executions
N = [1000, 2000, 4000, 16000] # size of the list
L = [100, 1000, 2000,16000] # max element of the list

# timing:
print 'Number of executions: %i' % (M)
print '-'*80
print '\tL\N\t|\t%i\t|\t%i\t|\t%i\t|\t%i' % (N[0], N[1], N[2], N[3])
print '-'*80
for l in L:
    print '\t%i\t' % l,
    for n in N: 
        t = 0
        for m in xrange(M):
            A = [random.randint(0,l-1) for r in xrange(n)] # generates an n long random list
            t0 = time.clock()
            pass # sort function call goes here
            t1 = time.clock()
            t += (t1-t0)
        print '|\t%0.3f\t' % ((t*1000.0)/M ), # avg time
    print
print '-'*80

Этот пустой тест занимает около 4 минут. Буду признателен за любые советы о том, как сделать это быстрее.

Приветствия

Edit: После подсказки Рэйфа Кеттлера я придумал следующее:

def sorting(LST):
    pass

if __name__ == "__main__" :
    M = 1000
    N = [1000, 2000, 4000, 16000]
    L = [100, 1000, 2000,16000]

    print 'Number of executions: %i' % (M)
    print '-'*80
    print '\tL\N\t|\t%i\t|\t%i\t|\t%i\t|\t%i' % (N[0], N[1], N[2], N[3])
    print '-'*80
    for l in L:
        print '\t%i\t' % l,
        for n in N:
            #------------------------
            t = timeit.Timer('sorting([random.randint(0,l-1) for r in xrange(n)])', 'from __main__ import sorting, n, l, random')
            #------------------------
            print '|\t%0.3f\t' % (t.timeit(M)/M ), # avg time
        print
    print '-'*80

К сожалению, это стало медленнее. Что я делаю не так?

Ответы [ 5 ]

12 голосов
/ 12 ноября 2010

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

2 голосов
/ 12 ноября 2010

Возможно заменить этот код:

A = [random.randint(0,l-1) for r in xrange(n)]

с генератором? например,

def A(n):
    for r in xrange(n):
        yield random.randint(0,l-1)

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

1 голос
/ 15 ноября 2010

Создание случайных чисел - трудоемкая задача.Вы создаете 4 *1000* (1000 + 2000 + 4000 + 16000) из них.Самый простой из возможных тестовых примеров занимает в моей системе более 7 минут:

>>> t=timeit.Timer('random.randint(0,15999)','import random')
>>> t.timeit(4*1000*(1000+2000+4000+16000))
447.08869618904077

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

0 голосов
/ 02 апреля 2011

Не совсем отвечает на вопрос о timimg, но вы можете использовать модуль random в пакете numpy для очень эффективного создания большого массива случайных чисел:

>>> from numpy import random
>>> l = 100; n = 16000
>>> random.randint(0,l-1,n)

Адаптация сценария OP, ниже приводится сравнение общего времени с использованием numpy.random v.s. фондовый случайный модуль:

numpy.random
number of executions: 1000
--------------------------------------------------------------------------------
        L\N     |       1000    |       2000    |       4000    |       16000
--------------------------------------------------------------------------------
        100     |       0.022   |       0.043   |       0.084   |       0.332
        1000    |       0.016   |       0.031   |       0.059   |       0.231
        2000    |       0.016   |       0.030   |       0.059   |       0.231
        16000   |       0.016   |       0.030   |       0.059   |       0.231
--------------------------------------------------------------------------------

random 
Number of executions: 1000
--------------------------------------------------------------------------------
        L\N     |       1000    |       2000    |       4000    |       16000
--------------------------------------------------------------------------------
        100     |       2.152   |       4.271   |       8.649   |       34.007
        1000    |       2.264   |       4.501   |       8.762   |       34.956
        2000    |       2.202   |       4.412   |       8.743   |       34.818
        16000   |       2.205   |       4.398   |       8.735   |       34.823
--------------------------------------------------------------------------------
0 голосов
/ 02 апреля 2011

Генерация случайных чисел один раз. Поместите их в файл полки или рассола, а затем прочитайте их, когда вам нужно запустить тест.

...