IOTXING

记录技术学习之路

0%

python range与xrange比较

range 与 xrange的区别 首先我们看一个测试

import time
def rangeTest():
    startTime = time.time()
    for i in range(1,100000000):
        pass
    stopTime = time.time()
    print 'range'
    print +stopTime-startTime
    print '------'

def xrangeTest():
    startTime = time.time()
    for i in xrange(1,100000000):
        pass
    stopTime = time.time()
    print 'range'
    print +stopTime - startTime
    print '------'

rangeTest()
xrangeTest()

我们分别用range和xrange从1循环到1亿,然后比较时间 我使用了pycharm的profile进行性能测试 可以看到range的时间明显会比xrange的多,至于为什么,我们可以通过图的方式来更加直观的看 可以看到range的耗时主要分为两种,一个是自身的循环,一个是range函数的占用,而xrange就只有一个循环,没有多余的时间消耗 下面我们通过对源码分析,来比较两种的区别

def range(x: int, y: int = 0, step: int = 1) -> List[int]: ...

class xrange(Sized, Iterable[int], Reversible[int]):
    @overload
    def __init__(self, stop: int) -> None: ...
    @overload
    def __init__(self, start: int, stop: int, step: int = 1) -> None: ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[int]: ...
    def __getitem__(self, i: int) -> int: ...
    def __reversed__(self) -> Iterator[int]: ...

我们可以看到使用range的时候,range函数返回的是一个list,如果size很大,list所消耗的资源也会增大 而使用xrange的时候,我们得到的是一个生成器 我们使用for i in range(100000)或者for i in xrange(1000000)的时候,实际上是对range()或者xrange()的返回值进行循环, python生成器讲解 由于对列表循环跟使用生成器进行循环,性能会相差比较多,而且range还需要先生成一个list,因此在使用的时候,xrange会比range能够省更多的资源,而且能够达到相同的效果 使用xrange会比range性能更好