5

膨大な量のデータ (ほぼ 600 万個!) を処理するための Python コードを作成しています。コードでは、巨大な for ループを使用して各セットを処理しています。そのループでは、ループごとに同じ変数を使用して上書きしています。プログラムを実行すると、実行時間が長くなるほど遅くなることに気付きました。さらに、さらに実験を重ねた結果、値 10,000 ~ 10,100 で実行した場合の速度は 0 ~ 100 と同じであることがわかりました。したがって、変数を作成するのではなく、単に既存の変数を処理するだけなので、上書きするたびに、変数、Python によってどこかに保存されている必要があります。

だから:私は正しいですか?上書きされた場所を保存するのはpythonである必要がありますか?それとも私が間違っていますか?他に何か起こっていますか?

4

2 に答える 2

0

Python は、上書きされた変数を保存する前に変数の元の値をコピーしません。

おそらく、プログラムの速度が低下しているさまざまなキャッシュの影響が見られます。または、オブジェクトを作成している場合、ガベージ コレクターが呼び出されて、作成したオブジェクトのうち参照されなくなったものを削除します。

あなたが見ているこの動作を示すサンプルコードはありますか?

例えば:

import hashlib
import random
import time
def test():
    t = []
    for i in xrange(20000):        
        if (i == 0) | (i==100)|(i==10000)|(i==10100):
            t.append(time.time())
        for j in range(1,10):
            a = hashlib.sha512(str(random.random()))
            b = hashlib.sha512(str(random.random()))
            c = hashlib.sha512(str(random.random()))
            d = hashlib.sha512(str(random.random()))
            e = hashlib.sha512(str(random.random()))
            f = hashlib.sha512(str(random.random()))
            g = hashlib.sha512(str(random.random()))
    print t[1]-t[0], t[3]-t[2]

次に、10回実行します。

>>> for i in range(10):
        test()
0.0153768062592 0.0147190093994
0.0148379802704 0.0147860050201
0.0145788192749 0.0147390365601
0.0147459506989 0.0146520137787
0.0147008895874 0.0147621631622
0.0145609378815 0.0146908760071
0.0144789218903 0.014506816864
0.0146539211273 0.0145659446716
0.0145878791809 0.0146989822388
0.0146920681 0.0147240161896

標準誤差内にほぼ同じ時間を与えます(特に、最初にa、b、c、d、e、f、gを初期化する必要があった場所でわずかに遅かった最初の間隔を除外した場合)。

于 2013-06-07T19:24:02.683 に答える