从range和xrange的性能对比到yield关键字(上)

使用xrange

 

当我们获取某个数量的循环时,我们惯用的手法是for循环和range函数,例如:

for i in range(10):
    print i

这里range(10)生成了一个长度为10的列表,内容为从0到9,所以这里的for循环实际上是在遍历其中的元素。

如果循环次数过大的时候,range要生成一个巨大的列表,这将导致程序的性能降低。

解决方案是采用xrange,用法基本与range相同:

for i in xrange(10):
    print i

但是二者的性能差距到底有多大?

 

性能测评

 

我们使用下面的程序做一个测试:

from time import time
from time import sleep
import sys

def count_time():
    def tmp(func):
        def wrapped(self, *args, **kargs):
            begin_time = time()
            result = func(self, *args, **kargs)
            end_time = time()
            cost_time = end_time - begin_time
            print ‘%s called cost time : %s ms‘ %(func.__name__, float(cost_time)*1000)
            return result
        return wrapped
    return tmp

@count_time()
def test1(length):
    for i in range(length):
        pass

@count_time()
def test2(length):
    for i in xrange(length):
        pass

if __name__ == ‘__main__‘:
    length = int(sys.argv[1])
    test1(length)
    test2(length)

上面的代码中,count_time是一个装饰器,用于统计程序运行的时间。

我们下面开始正式的测试:

[email protected]:~/Documents/py|?  python 10.py 100000
test1 called cost time : 13.8590335846 ms
test2 called cost time : 3.76796722412 ms
[email protected]:~/Documents/py|?  python 10.py 100000
test1 called cost time : 16.725063324 ms
test2 called cost time : 3.08418273926 ms
[email protected]:~/Documents/py|?  python 10.py 200000
test1 called cost time : 34.875869751 ms
test2 called cost time : 7.85899162292 ms
[email protected]:~/Documents/py|?  python 10.py 500000
test1 called cost time : 41.6638851166 ms
test2 called cost time : 17.1940326691 ms
[email protected]:~/Documents/py|?  python 10.py 500000
test1 called cost time : 59.8731040955 ms
test2 called cost time : 14.0538215637 ms
[email protected]:~/Documents/py|?  python 10.py 500000
test1 called cost time : 94.1109657288 ms
test2 called cost time : 8.5780620575 ms
[email protected]:~/Documents/py|?  python 10.py 500000
test1 called cost time : 61.615228653 ms
test2 called cost time : 7.21502304077 ms

结果令我们大吃一惊,二者的差距非常明显,最高的时候差距了十几倍。

我们再选取几个较小的数据:

[email protected]:~/Documents/py|?  python 10.py 10
test1 called cost time : 0.00596046447754 ms
test2 called cost time : 0.0109672546387 ms
[email protected]:~/Documents/py|?  python 10.py 20
test1 called cost time : 0.00619888305664 ms
test2 called cost time : 0.159025192261 ms
[email protected]:~/Documents/py|?  python 10.py 50
test1 called cost time : 0.00786781311035 ms
test2 called cost time : 0.00405311584473 ms
[email protected]:~/Documents/py|?  python 10.py 100
test1 called cost time : 0.00786781311035 ms
test2 called cost time : 0.00309944152832 ms

这次range的性能并不差,甚至开始还略显高。

我们可以得出结论,当n较小时,我们使用range,但当i超过一定范围时,我们就必须考虑使用xrange了

但是,二者性能差距的原因在哪里?

我们下文分析。

时间: 2024-10-22 01:04:06

从range和xrange的性能对比到yield关键字(上)的相关文章

Python中range和xrange对比

range 函数说明:range([start,] stop [, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. range示例: >>> range(5) [0, 1, 2, 3, 4] >>> range(1,5) [1, 2, 3, 4] >>> range(0,6,2) [0, 2, 4] xrange 函数说明:用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器. xrange示例

[Python]range与xrange用法对比

[整理内容]具体如下: 先来看如下示例:>>>x=xrange(0,8)>>> print xxrange(8)>>>print x[0]0>>>print x[7]7>>>print x[8]Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: xrange obj

redis和ssdb读取性能对比

最近关注了一下ssdb,他的特点是基于文件存储系统所以它支撑量大的数据而不因为内存的限制受取约束.从官网的测试报告来看其性能也非常出色和redis相当,因此可以使用他代表redis来进行k-v数据业务的处理.想法总是美好的,不过现实中就可能非常骨感. 以于针对Redis和ssdb的几个读操进行一个简单的性能测试对比,这个测试不是直接在本机调用Redis和ssdb. 而是通过一个程序在别的服务器上调用.测试指令(get,hget,lregion)以下是测试结果截图 测试代码 private voi

python 中range与xrange的区别

先来看看range与xrange的用法介绍 help(range)Help on built-in function range in module __builtin__: range(...) range(stop) -> list of integers range(start, stop[, step]) -> list of integers Return a list containing an arithmetic progression of integers. range(i

函数range()与xrange()的比较

range与xrange的比较 range 函数用法: range(stop) range(start,stop[,step]) 函数说明: 这是一个创建包含数列的列表的通用函数.它最常用于for循环.参数必须为普通的整数.如果step参数省略,则默认为1.如果start参数省略,则默认为0.该函数的完整形式返回一个整数列表[start, start + step, start + 2 * step, -].如果step为正,则最后一个元素start + i * step最大且小于stop:如果

range和xrange的区别详解

两种用法介绍如下:1.range([start], stop[, step])返回等差数列.构建等差数列,起点是start,终点是stop,但不包含stop,公差是step.start和step是可选项,没给出start时,从0开始:没给出step时,默认公差为1.例如: >>> range(10) #起点是0,终点是10,但是不包括10 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1,10) #起点是1,终点是10,但是不包括10

Python的range和xrange

range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. range示例: >>> range(6) [0, 1, 2, 3, 4, 5] >>> range(0,6,2) [0, 2, 4] xrange 函数说明:语法上和range完全相同,所不同的是生成的不是一个数组,而是一个生成器.xrange示例: >>> xrange(6) xrange(6)

range与xrange的区别

一.Python中range()与xrange()有什么区别 range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列 range(6) #[0, 1, 2, 3, 4, 5] range(1,6) #[1, 2, 3, 4, 5] range(1,6,2) #[1, 3, 5] #也就是说range()返回的是个列表 xrange用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器 xrang

python2中range和xrange的区别

range和xrange用法相同,不同的是xrange不是生成一个序列,而是作为一个生成器,即生成一个取出一个 相对来说,xrange比range性能优化很多,因为不需要一下子开辟一块很大的内存,特别是数据量比较大的时候 注意: xrange和range这两个基本是使用在循环的时候 当需要输出一个列表的时候,就必须要使用range了 原文地址:https://www.cnblogs.com/z-x-y/p/9998672.html