我做了几个测试,发现 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
本身慢很多?
我看到了this question on the slowness of list()
, dict()
, and other constructor methods ,这就是为什么 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
最佳答案
当然 range()
会更快,当您想要的最终产品是一个范围内所有数字的列表时,range
会在单个函数调用。与 list(xrange())
相反,它给 list(..)
构造函数增加了 rangeiterator
对象的开销来迭代创建xrange
对象,list(..)
构造函数必须使用它。而 range()
立即构建列表,没有中间迭代器消耗......这怎么可能被打败?主要区别在于:1 次函数调用与 2 次比较次要的是 1 次全局查找与 2 次。
关于python - 为什么 list(xrange) 比 range() 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16252637/