3

学術的な質問です。この関数は、最大値までの整数に対してベンフォードの法則を計算し、要約テーブルを出力します。ネストされた for ループ メソッド、dict メソッド、およびこのコレクション メソッドを試しました。後者 (以下のコード) が最速 (timeit 結果: 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)+' %']))
4

1 に答える 1

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 秒に短縮されます。

言い換えれば、時間の大部分はオペランドの 2 乗に費やされます。

"%s" % ((i+1)**2)不思議なことに、代わりに を使用することで約 0.05 秒削ることができましたstr((i+1)**2)

于 2013-05-28T18:29:15.597 に答える