如果你总是喜欢xrange()超过范围()?

为什么或者为什么不?


为了提高性能,特别是在迭代大范围时, xrange()通常更好。 但是,仍然有一些情况为什么你可能更喜欢range()

  • 在Python 3中, range()执行xrange()用于执行的操作,而xrange()不存在。 如果您想编写可在Python 2和Python 3上运行的代码,则不能使用xrange()

  • range()在某些情况下实际上可能更快 - 例如。 如果多次迭代相同的序列。 xrange()必须每次重建整数对象,但range()将具有实数整数对象。 (然而,内存方面总是会变差)

  • xrange()在所有需要真实列表的情况下都不可用。 例如,它不支持切片或任何列表方法。

  • [编辑]有几个帖子提到2to3工具将如何升级range() 。 为了记录,下面是在range()xrange()一些示例用法上运行该工具的输出

    RefactoringTool: Skipping implicit fixer: buffer
    RefactoringTool: Skipping implicit fixer: idioms
    RefactoringTool: Skipping implicit fixer: ws_comma
    --- range_test.py (original)
    +++ range_test.py (refactored)
    @@ -1,7 +1,7 @@
    
     for x in range(20):
    -    a=range(20)
    +    a=list(range(20))
         b=list(range(20))
         c=[x for x in range(20)]
         d=(x for x in range(20))
    -    e=xrange(20)
    +    e=range(20)
    

    正如你所看到的,当在for循环或者理解中使用时,或者在已经用list()包装的地方,范围保持不变。


    不,他们都有他们的用途:

    迭代时使用xrange() ,因为它可以节省内存。 说:

    for x in xrange(1, one_zillion):
    

    而不是:

    for x in range(1, one_zillion):
    

    另一方面,如果你真的想要一个数字列表,使用range()

    multiples_of_seven = range(7,100,7)
    print "Multiples of seven < 100: ", multiples_of_seven
    

    只有当你需要一个实际的列表时,你应该偏好range()不是xrange() 。 例如,当你想修改由range()返回的列表,或者当你希望对它进行分片时。 对于迭代或甚至只是正常的索引, xrange()将正常工作(通常效率更高)。 对于非常小的列表, range()xrange()快一点,但取决于您的硬件和各种其他细节,收支平衡可以是长度为1或2的结果; 不要担心。 喜欢xrange()

    链接地址: http://www.djcxy.com/p/23993.html

    上一篇: Should you always favor xrange() over range()?

    下一篇: How to check if a map contains a key in go?