一个学术问题。此函数为最大值为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)+' %']))
答案 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秒。