0

設定された反復回数(1000回)で100万回を超える「forループ」を呼び出すスクリプトがあります。range()スレッドとxrange()スレッドを読みましたが、このようなことはしたくないことを認識しています。

for o in xrange(1000000):
    for i in range(1000): #Definitely do not want
        pass              

代わりに、1000個の要素を含むオブジェクトを作成し、それを使用して常に反復したいと思います。

方法1:

iterate=range(1000)
for o in xrange(1000000):
    for i in iterate:    #<---
        pass

方法2:

for o in xrange(1000000):
    for i in xrange(1000):    #<----
        pass

「forループ」内でどちらの方法を使用するとパフォーマンスが向上するのか疑問に思いました。ありがとうございました。

編集:ごめんなさい。よくわからなかったと思います。私の問題は、私が喚起しているこの内部ループを、すでに作成されたリストを使用するか、パフォーマンスを向上させるためにxrange()を使用するかどうかです。

4

5 に答える 5

3

いくつかのローカルテスト結果:

>>> timeit.timeit('for i in repeat(None, 1000): pass', setup='from itertools import repeat', number=100000)
1.94118924332561
>>> timeit.timeit('for i in xrange(1000): pass', number=100000)
2.5231991775491025
>>> timeit.timeit('for i in range(1000): pass', number=100000)
3.9302601308266816
>>> timeit.timeit('for i in r: pass', setup='r = [None] * 1000', number=100000)
2.0900103923822684
>>> timeit.timeit('for i in r: pass', setup='r = range(1000)', number=100000)
2.2248894063351656
>>> timeit.timeit('for i in r: pass', setup='r = xrange(1000)', number=100000)
2.9105822108675823

イテレータはジェネレータのように動作するため、キャッシュを使用することはできませんitertools.repeat(値を「読み取る」ことができるのは一度だけで、その後はなくなります)。

名前を検索する必要がなくなるため、繰り返し1などの処理が非常に高速になる可能性がありますが、テスト結果のランダムな変動のノイズによって、このようなパフォーマンス上の利点は失われます。None

于 2012-05-01T15:56:24.603 に答える
2

xrange()より少ないメモリを消費しますrange()。また、より高速です。

In [1]: %timeit for i in range(1000): pass

10000 loops, best of 3: 28.8 us per loop

In [2]: %timeit for i in xrange(1000): pass

100000 loops, best of 3: 18.3 us per loop

(Linux上の64ビットPython 2.7.2。)

上記はxrange()直接使用することに注意してください。2番目のコードスニペット(withが付いているものiterate)は、を使用する利点を無効にするため、xrange()避ける必要があります。

于 2012-05-01T15:19:24.013 に答える
2

xrangePython 2.xおよびrange3.xでは、メモリ内にリストを作成しないため、値を反復処理するだけの場合に最適です。ただし、リスト式を使用して一時リストを作成すると、目的が無効になります。代わりに、次のようにします。

for i in xrange(1000): # range in Python 3.x
    pass

1000のような少数の場合、これがパフォーマンスに大きな影響を与える可能性は低いです(2.xのドキュメントには、overの利点は最小限xrangerangeであると記載されています)。代わりに、プログラムのベンチマークを行い、どの部分が遅いかを調べます。

于 2012-05-01T15:20:43.330 に答える
0

xrangeは、反復する前に結果のリスト全体を割り当てる必要がないため、パフォーマンスが向上します。これにより、とりわけデータキャッシュの一貫性が向上します。

編集:あなたの例を見ると、あなたは両方の時間でリストを作成しています。次に、xrangeを介してリスト内包表記を使用してリストを作成するよりも、範囲リストを作成することに専念しているため、範囲を使用するとパフォーマンスが向上すると思います。

于 2012-05-01T15:19:29.800 に答える
0

それは価値があるでしょう。の利点xrangeは、iterableを返すことです。つまり、N個の要素のリストを作成して(のようにrange)返すことはありません。

def xrange(n):
    i = 0
    while i < n:
        yield i

xrangeはこれに似ています。iterate = [x for x in xrange(1000)]つまり、LCは次のようになりますiterate = range(1000)

正しいコードは次のとおりです。

for i in xrange(1000):
    pass
于 2012-05-01T15:21:52.927 に答える