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 随机生成中文验证码的实例代码
Mar 20 Python
python处理csv数据的方法
Mar 11 Python
在Django的模板中使用认证数据的方法
Jul 23 Python
如何使用python爬取csdn博客访问量
Feb 14 Python
Python中datetime模块参考手册
Jan 13 Python
Python实现在线音乐播放器
Mar 03 Python
python pygame模块编写飞机大战
Nov 20 Python
用python拟合等角螺线的实现示例
Dec 27 Python
python读取ini配置的类封装代码实例
Jan 08 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
Python内置异常类型全面汇总
May 28 Python
python源文件的字符编码知识点详解
Mar 04 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
javascript正则表达式总结
2016/02/29 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
详解JS函数stack size计算方法
2018/06/18 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
python实现保存网页到本地示例
2014/03/16 Python
跟老齐学Python之list和str比较
2014/09/20 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
设备动力科岗位职责范本
2014/02/23 职场文书
爱心助学感谢信
2015/01/21 职场文书
2015年教研工作总结
2015/05/23 职场文书
mysql函数全面总结
2021/11/11 MySQL