使用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(*args, **kargs):
begin_time = time()
result = func(*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是一个装饰器,用于统计程序运行的时间。

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

wing@ubuntu:~/Documents/py|⇒  python 10.py 100000
test1 called cost time : 13.8590335846 ms
test2 called cost time : 3.76796722412 ms
wing@ubuntu:~/Documents/py|⇒ python 10.py 100000
test1 called cost time : 16.725063324 ms
test2 called cost time : 3.08418273926 ms
wing@ubuntu:~/Documents/py|⇒ python 10.py 200000
test1 called cost time : 34.875869751 ms
test2 called cost time : 7.85899162292 ms
wing@ubuntu:~/Documents/py|⇒ python 10.py 500000
test1 called cost time : 41.6638851166 ms
test2 called cost time : 17.1940326691 ms
wing@ubuntu:~/Documents/py|⇒ python 10.py 500000
test1 called cost time : 59.8731040955 ms
test2 called cost time : 14.0538215637 ms
wing@ubuntu:~/Documents/py|⇒ python 10.py 500000
test1 called cost time : 94.1109657288 ms
test2 called cost time : 8.5780620575 ms
wing@ubuntu:~/Documents/py|⇒ python 10.py 500000
test1 called cost time : 61.615228653 ms
test2 called cost time : 7.21502304077 ms

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

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

wing@ubuntu:~/Documents/py|⇒  python 10.py 10
test1 called cost time : 0.00596046447754 ms
test2 called cost time : 0.0109672546387 ms
wing@ubuntu:~/Documents/py|⇒ python 10.py 20
test1 called cost time : 0.00619888305664 ms
test2 called cost time : 0.159025192261 ms
wing@ubuntu:~/Documents/py|⇒ python 10.py 50
test1 called cost time : 0.00786781311035 ms
test2 called cost time : 0.00405311584473 ms
wing@ubuntu:~/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了

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

我们下文分析。

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

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

    上节提出了range和xrange的效率问题,这节我们来探究其中的原因   yield的使用   我们看下面的程序: #coding: utf-8 def test(): print 4 print ...

  2. [Python]range与xrange用法对比

    [整理内容]具体如下: 先来看如下示例:>>>x=xrange(0,8)>>> print xxrange(8)>>>print x[0]0> ...

  3. 实验比较python中的range和xrange

    1 结论: 全用xrange,除非你需要使用返回的列表 2 实验一:性能对比 实验环境:win7 ,64位系统 python2.7 import time StartTime=time.time() ...

  4. Python从题目中学习:range()和xrange()

    近期给公司培训Python,好好啃了啃书本,查了查资料,总结一些知识点. --------------------------------------------------------------- ...

  5. python 中range与xrange的区别

    先来看看range与xrange的用法介绍 help(range)Help on built-in function range in module __builtin__: range(...) r ...

  6. range和xrange的区别详解

    两种用法介绍如下:1.range([start], stop[, step])返回等差数列.构建等差数列,起点是start,终点是stop,但不包含stop,公差是step.start和step是可选 ...

  7. Suspend to RAM和Suspend to Idle分析,以及在HiKey上性能对比【转】

    转自:https://www.cnblogs.com/arnoldlu/p/6253665.html 测试环境:AOSP 7.1.1+Kernel 4.4.17 HW:HiKey Ubuntu 14. ...

  8. range与xrange的区别

    一.Python中range()与xrange()有什么区别 range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列 rang ...

  9. python中range、xrange和randrange的区别

    range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个列表. xrange 函数说明:和range 的用法完 ...

随机推荐

  1. [转]VS 2013 连接数据库报错 未能加载文件或程序集 Microsoft.SqlServer.Management.Sdk.Sfc

    原文链接:http://stackoverflow.com/questions/16906686/could-not-load-file-or-assembly-microsoft-sqlserver ...

  2. SecureCRT自动备份脚本-华为

    # $language = "VBScript" # $interface = "1.0" Sub Main Const ForReading = 1, For ...

  3. each处理json数据

    eg:给传进来的ID中当其对应的值为true时,即给对应的ID标签添加一个class 名为  focus,如: var obj = { id01:'true', id02:'flase', id03: ...

  4. com.apache.dc.query.Query所属包名apache-common-sid.jar

    com.apache.dc.query.Query所属包名apache-common-sid.jar 首先这个类是基于HQL的,好多方法里面要传String clzz, 刚开始我真不知道这个参数传什么 ...

  5. zlog使用

    1.使用buildroot编译zlog,在工具链的系统根目录下会生成动态库和静态库,还添加了头文件. 2.把动态库拷贝到开发板文件系统(该文件系统可以不是由buildroot编译得到,而是板上自带的) ...

  6. Ubuntu设置squid代理

    1.安装squid sudo apt-get install squid 2,修改配置,增加需要使用代理的ip vi命令修改: vi /etc/squid/squid.conf 图形界面编辑 sudo ...

  7. PHP ftp使用

    本文章来总结几个利用php中的ftp功能来实现通过FTP上传文件,有需要学习的朋友可参考参考.ftp_get() 函数从 FTP 服务器上下载一个文件.若成功则返回 true,失败则返回 false. ...

  8. JS-for中的i

    var aBtn = document.getElementsByTagName('input');        for( var i=0; i<aBtn.length; i++ ){     ...

  9. 【堆】【kd-tree】bzoj2626 JZPFAR

    用堆记录答案.看看当前点是否比堆顶更优. #include<cstdio> #include<queue> #include<cstring> #include&l ...

  10. java环境配置总结

    最近接触java,在环境配置上费了不少劲.总结一下: 1.首先安装jdk和Eclipse,jdk我安装的是1.6,Eclipse可以从官网下载:http://download.eclipse.org/ ...