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性能更好