2010-11-11 48 views
3

我希望有人能幫助我解決這個問題。 我想測量排序算法。以下是我目前的做法:Python時機 - 必須有更好的方法!

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分鐘。我很感激任何關於如何使其更快的建議。

乾杯

編輯: 雷夫凱特勒的提示後,我想出了這個:

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 

不幸的是,越來越慢。我究竟做錯了什麼?

回答

13

timeit。在Python中使用時間的最佳方式。將算法重構爲函數並使用timeit來測試執行時間。

+3

並且一定要在定時功能之外設置您的測試數據! – 2010-11-11 22:48:20

+0

@MarkRansom同意。 – 2010-11-11 22:54:52

+0

感謝您在時間表上的提醒! – Stiggo 2010-11-12 11:12:21

2

你將這段代碼有可能:

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

生成器表達式:'A =(random.randint(0,l-1)for r in xrange(n))' – codewarrior 2010-11-12 01:46:58

+0

我試過用[]和()以及它們之間只有幾秒鐘。我知道生成隨機數是非常耗時的任務。但它一定是一個更快的方法。我還沒有找到它。我希望我能。 – Stiggo 2010-11-12 19:36:57

1

創建隨機數是一個耗時的任務。您正在創建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

我知道它是92.000.000的隨機數,需要很多時間。但目前我不知道如何爲每次重複生成一個新的隨機列表。我希望每1000 * 4次使用一個新的輸入列表來獲得「準確性」(或者「更多deitalied圖片」抱歉,我不知道正確的英文表達方式)。 – Stiggo 2010-11-15 17:43:06

+0

@Stiggo,我並不是說你改變了生成測試數據的方式,只是解釋說不管你怎麼做都需要很長時間。只需更改測試的參數,以便不計算數據生成,並接受運行需要很長時間的事實。 – 2010-11-15 18:49:54

0

生成一次隨機數。將它們放在擱架或醃製文件中,然後在需要運行測試時讀出它們。

0

不太回答timimg問題,但你可以使用隨機模塊numpy的軟件包生成大陣的隨機數非常effeciently:

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

適應OP的腳本,下面是一個使用numpy的總時間比較.random與股票隨機模塊:

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 
-------------------------------------------------------------------------------- 
相關問題