2013-05-28 41 views
3

一個學術問題。此函數計算最大值爲0的整數Benford's Law,並打印彙總表。我試過了一個嵌套的for-loop方法,一個字典方法和這個集合方法。後者(代碼如下)似乎是最快的(時間結果:1.4852424694秒),但是有沒有一種更快速和高效的內存循環方法來實現如此多的可能性?更高效的Benford法則代碼?

from __future__ import print_function 
def BenfordsLaw4(maxvalue = 10**6): 
    from collections import Counter 
    sqList = (str((i+1)**2)[0] for i in range(maxvalue)) 
    BenfordList = Counter(sqList) 

    print("Benford's Law for numbers between 1 and", maxvalue, "\nDigits,\t\t\t", "Count,\t\t\t", "Percentage") 
    for i,j in sorted(BenfordList.iteritems()): 
     print(',\t\t\t\t'.join([str(i), str(j), str(j*100./maxvalue)+' %'])) 
+0

其他方法的時間是什麼? – mtrw

+1

在Python 2.7中,'xrange'可能比'range'快一點,肯定會提高內存效率。 – Gabe

+0

在那裏做什麼** 2?這可能要花費大部分時間,並導致您測量2的權力高達2^1,000,000非整數高達1,000,000。 – Gabe

回答

1

改變主迴路以這樣的:

def BenfordsLaw4(maxvalue = 10**6): 
    BenfordList = {str(i+1):0 for i in range(9)} 
    for i in (str((i+1)**2)[0] for i in xrange(maxvalue)): 
     BenfordList[i] += 1 

進行約1.55s至約1.25的時間;然而拿出**2需要時間降低到大約0.32s。

換句話說,絕大部分時間都花在了平分操作數上。

奇怪的是,我能夠通過使用"%s" % ((i+1)**2)而不是str((i+1)**2)來減少約0.05s。

+0

甜!我認爲大部分時間都用於生成數字(即函數或數據讀取),但我真的很希望你的答案更快(1.2564006048秒),並避免導入特殊的方法。 – ksed

+0

可以將範圍改爲'range(1,10)',並避免使用'+ 1'選項 –