私はPythonのジェネレータを調べていて、少し実験をすることにしました。xrangeで生成されたジェネレータは、xrangeで生成されたジェネレータよりも速く歩留まりで生産されるのはなぜですか?
TOTAL = 100000000
def my_sequence():
i = 0
while i < TOTAL:
yield i
i += 1
def my_list():
return range(TOTAL)
def my_xrange():
return xrange(TOTAL)
メモリ使用量(プロセスRSSメモリを取得するためにpsutilを使用して)、時間撮影した(time.time()を使用して)各メソッドを複数回実行して平均値を取った後、以下の通りであるが:
sequence_of_values = my_sequence() # Memory usage: 6782976B Time taken: 9.53674e-07 s
sequence_of_values2 = my_xrange() # Memory usage: 6774784B Time taken: 2.14576e-06 s
list_of_values = my_list() # Memory usage: 3266207744B Time taken: 1.80253s
私は、xrangeを使用して発電機を生産することは、歩留まりを使用して発電機を生産することよりも(わずかに)遅くなることに気づいた。どうしてこんなことに?
'xrange'はジェネレータではないシーケンスオブジェクトであるため、内部構造はまったく同じではありません。また、あなたが与えたタイミングは、xrangeとジェネレーターとの間に大きな違いはありません。実際には違いはごくわずかです – smac89
修正するには、 'xrange'を使うときに実際にリストを作成することです。 'my_xrange'関数では、xrange_generator_(実際にはジェネレータではありません)を返すだけです。しかし、それはまだ完全なリストに処理されていません。だから、上記の数よりもさらに遅くなるかもしれません。 – aneroid
ジェネレータを構築し、 'xrange'オブジェクトを構築するのに必要な時間を計測するだけです。これらのオブジェクトを実際に反復するのにかかる時間は計測していません。 – mgilson