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 的 Socket 编程
Mar 24 Python
Python判断字符串与大小写转换
Jun 08 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 Python
python入门前的第一课 python怎样入门
Mar 06 Python
pandas表连接 索引上的合并方法
Jun 08 Python
Python一句代码实现找出所有水仙花数的方法
Nov 13 Python
Python进度条的制作代码实例
Aug 31 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
分享提高 Python 代码的可读性的技巧
Mar 03 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 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
深入array multisort排序原理的详解
2013/06/18 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
Javascript实现滑块滑动改变值的实现代码
2013/04/12 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
tab栏切换原理
2017/03/22 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
python中的sort方法使用详解
2014/07/25 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Python3中的json模块使用详解
2018/05/05 Python
linux环境下Django的安装配置详解
2019/07/22 Python
wxPython实现画图板
2020/08/27 Python
学习python需要有编程基础吗
2020/06/02 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
社会稳定风险评估方案
2014/06/02 职场文书
广播体操口号
2014/06/18 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
城南旧事读书笔记
2015/06/29 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA