私はいくつかのテストを行っていましたが、 (さまざまな質問/回答でも確認されているように)よりもはるかにxrange()
高速であることがわかりました。range()
>>> from timeit import timeit
>>> timeit(stmt = 'x = range(1000)', number = 10000)
0.38216601211680734
>>> timeit(stmt = 'x = xrange(1000)', number = 10000)
0.010537726631953959 # xrange is much faster than range
私は興味を持ったので、別のテストを試して、list(xrange(1000))
単によりも高速になるかどうかを確認しましたrange(1000)
。
>>> timeit(stmt = 'x = range(1000)', number = 10000)
0.3858838963796529
>>> timeit(stmt = 'x = list(xrange(1000))', number = 10000)
0.492734766028903 # now, xrange is slower
これは、より多くの呼び出しにも当てはまります。
>>> timeit(stmt = 'x = range(1000)', number = 100000)
3.6457308233315757
>>> timeit(stmt = 'x = list(xrange(1000))', number = 100000)
5.722031755612818
それで、私の質問は、なぜそれ自体list(xrange)
よりも大幅に遅いのですか?range
、、およびその他のコンストラクター メソッドの遅さに関するこの質問list()
dict()
を見たので、なぜlist(xrange)
そんなに遅いのでしょうか?
を使用すると、が よりも多くの計算dis.dis()
を実行することがわかりました):list(xrange)
range
>>> dis.dis('x = list(xrange(1000))')
0 SETUP_LOOP 15648 (to 15651)
3 SLICE+2
4 IMPORT_NAME 29545 (29545)
7 LOAD_GLOBAL 30760 (30760)
10 POP_JUMP_IF_FALSE 28257
13 BUILD_LIST 10341
16 <49>
17 <48>
18 <48>
19 <48>
20 STORE_SLICE+1
21 STORE_SLICE+1
>>> dis.dis('x = range(1000)')
0 SETUP_LOOP 15648 (to 15651)
3 SLICE+2
4 POP_JUMP_IF_FALSE 28257
7 BUILD_LIST 10341
10 <49>
11 <48>
12 <48>
13 <48>
14 STORE_SLICE+1