Python while、for、生成器、列表推导等语句的执行效率测试


Posted in Python onJune 03, 2015

一个功能的实现,可以用多种语句来实现,比如说:while语句、for语句、生成器、列表推导、内置函数等实现,然而他们的效率并不一样。写了一个小程序来测试它们执行的效率。

测试内容:
将一个数字大小为20万的数字,依次取绝对值,放到列表中,测试重复1千次.
测试程序:

import time,sys  

reps = 1000                #测试重复次数  

nums = 200000              #测试时数字大小  

  

  

def tester(func,*args):    #总体测试函数  

    startTime = time.time()  

    for i in range(reps):  

        func(*args)  

    elapsed = time.time() - startTime #用time模块来测试,结束时间与开始时间差  

    return elapsed  

  

def while_Statement():     #while循环实现  

    res = []  

    x   = 0  

    while nums > x:  

        x += 1  

        res.append(abs(x))  

  

def for_Statement():       #for循环实现  

    res = []  

    for x in range(nums):  

        res.append(abs(x))  

  

def generator_Expression():#生成器实现  

    res = list(abs(x) for x in range(nums))  

  

def list_Comprehension():  #列表解析实现  

    res = [abs(x) for x in range(nums)]  

  

  

def map_Function():        #内置函数map实现  

    res = map(abs, range(nums))  

  

  

print sys.version          #打印系统版本  

tests = [while_Statement, for_Statement, generator_Expression, list_Comprehension, map_Function]  

for testfunc in tests:     #将待测函数放置列表中依次遍历  

    print testfunc.__name__.ljust(20),': ',tester(testfunc)  #  

 

测试结果:

>>>   

2.7.4 (default, Apr  6 2013, 19:55:15) [MSC v.1500 64 bit (AMD64)]  

while_Statement      :  84.5769999027  

for_Statement        :  75.2709999084  

generator_Expression :  62.3519999981  

list_Comprehension   :  60.4090001583  

map_Function         :  47.5629999638 

改写程序:
import sys  

nums = 100  

  

def while_Statement():  

    res = []  

    x   = 0  

    while nums > x:  

        x += 1  

        res.append(abs(x))  

  

def for_Statement():  

    res = []  

    for x in range(nums):  

        res.append(abs(x))  

  

def generator_Expression():  

    res = list(abs(x) for x in range(nums))  

  

def list_Comprehension():  

    res = [abs(x) for x in range(nums)]  

  

  

def map_Function():  

    res = map(abs, range(nums))  

  

if __name__=='__main__':  

    import timeit            #用timeit模块来测试  

    print sys.version  

    funcs = [while_Statement, for_Statement, generator_Expression, list_Comprehension, map_Function]  

    for func in funcs:  

        print func.__name__.ljust(20),': ',timeit.timeit("func()", setup="from __main__ import func") 

测试结果:

>>>   

2.7.4 (default, Apr  6 2013, 19:55:15) [MSC v.1500 64 bit (AMD64)]  

while_Statement      :  37.1800067428  

for_Statement        :  30.3999109329  

generator_Expression :  27.2597866441  

list_Comprehension   :  17.386223449  

map_Function         :  12.7386868963 

测试分析:

用time模块,和timeit模块两种测试方式测试了很多组数字,得出的结果是执行内置函数最快,其次就是列表推导,再其次生成器和for循环,while循环最慢。一般最快的使用内置函数的方法要比使用最慢的while快两倍以上。简单分析下原因:内置函数比如说map,filter,reduce(在Python3.0中移除)基本上都是用C语言来实现的,所以速度是最快的,列表推导内的迭代在解释器内是以C语言的速度运行的(一般是for循环的两倍,对大型文件操作而言,用列表推导效果尤其明显),相比较for循环代码是在PVM步进运行要快的多。但for循环里面含range(),相对速度也会快些,while语句是纯粹用Python代码写成,所以速度最慢。所以函数式编程最好使用内置函数,然后才考虑使用列表推导或for循环。最好不用while循环.

Python 相关文章推荐
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 Python
PyQt5 QSerialPort子线程操作的实现
Apr 21 Python
浅析Python函数式编程
Oct 06 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
python之yield和Generator深入解析
Sep 18 Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 Python
keras中模型训练class_weight,sample_weight区别说明
May 23 Python
python 对xml解析的示例
Feb 27 Python
Python使用openpyxl复制整张sheet
Mar 24 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 Python
Python fileinput模块使用实例
Jun 03 #Python
以windows service方式运行Python程序的方法
Jun 03 #Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 #Python
python中list常用操作实例详解
Jun 03 #Python
python中argparse模块用法实例详解
Jun 03 #Python
Python中的推导式使用详解
Jun 03 #Python
对于Python装饰器使用的一些建议
Jun 03 #Python
You might like
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
连接Python程序与MySQL的教程
2015/04/29 Python
python生成验证码图片代码分享
2016/01/28 Python
Python 关于反射和类的特殊成员方法
2017/09/14 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
Python类如何定义私有变量
2020/02/03 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
运动会广播稿500字
2014/01/28 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
法律七进实施方案
2014/03/15 职场文书
授权委托书范文
2014/07/31 职场文书
2016继续教育研修日志
2015/11/13 职场文书