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中使用Queue和Condition进行线程同步的方法
Jan 19 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
Jan 12 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
Python实现带参数的用户验证功能装饰器示例
Dec 14 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
Python列表切片常用操作实例解析
Dec 16 Python
详解python logging日志传输
Jul 01 Python
python中pivot()函数基础知识点
Jan 03 Python
python 模拟在天空中放风筝的示例代码
Apr 21 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
PHP5 面向对象程序设计
2008/02/13 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
php中请求url的五种方法总结
2017/07/13 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
详解express + mock让前后台并行开发
2018/06/06 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python实现的系统实用log类实例
2015/06/30 Python
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
TensorFlow实现简单的CNN的方法
2019/07/18 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
公司新员工的演讲稿注意事项
2014/01/01 职场文书
个人培训自我鉴定
2014/03/28 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
国庆横幅标语
2014/10/08 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python