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中的输入和输出功能进行读取和写入的教程
Apr 14 Python
Python实现列表转换成字典数据结构的方法
Mar 11 Python
python+Django+apache的配置方法详解
Jun 01 Python
Python使用django搭建web开发环境
Jun 09 Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
Apr 11 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
基于Python的OCR实现示例
Apr 03 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
python属于哪种语言
Aug 16 Python
numpy数据类型dtype转换实现
Apr 24 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实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
常用的javascript设计模式
2017/01/11 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
Python3基础之条件与循环控制实例解析
2014/08/13 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
Django入门使用示例
2017/12/12 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
python deque模块简单使用代码实例
2020/03/12 Python
django model object序列化实例
2020/03/13 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
英文简历中的自我评价用语
2013/12/09 职场文书
新书吧创业计划书
2014/01/31 职场文书
养牛场项目建议书
2014/05/13 职场文书
二手房购房协议书范本
2014/10/05 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
vue首次渲染全过程
2021/04/21 Vue.js