一个更有效的本福德法律代码?

时间:2013-05-28 16:35:56

标签: python-2.7

一个学术问题。此函数为最大值为maxvalue的整数计算Benford's Law,并打印摘要表。我试过一个嵌套的for循环方法,一个dict方法和这个集合方法。后者(下面的代码)似乎是最快的(时间结果:1.4852424694秒),但有没有更快,更节省内存的方法来循环这么多的可能性?

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)+' %']))

1 个答案:

答案 0 :(得分: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.55秒到大约1.25;然而取出**2需要花费大约0.32秒的时间。

换句话说,你的绝大部分时间花在了操作上。

奇怪的是,使用"%s" % ((i+1)**2)代替str((i+1)**2),我能够剃掉大约0.05秒。