python - 为什么 list(xrange) 比 range() 慢?

标签 python performance python-2.7

我做了几个测试,发现 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/

相关文章:

Android,在列表适配器中有效地加载图像

python - groupby 在搜索 View 中的多对多关系字段上?

arrays - 二维 numpy 数组中的最大频率一维数组

python - python 的 shutil.copyfile() 是原子的吗?

python - 划分不同数据帧的两列

python - 以特定格式反向打印列表中的元素

python - 使用Sphinx使用:glob:生成Python文档

c++ - 如何在 ROOT (CERN) 中禁用屏幕输出

python - 希望加快这个最大成对产品

python-2.7 - Popen.wait() 的常见/实际用途是什么