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 30 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
pandas使用apply多列生成一列数据的实例
Nov 28 Python
python中的列表与元组的使用
Aug 08 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
Python使用type动态创建类操作示例
Feb 29 Python
pandas数据拼接的实现示例
Apr 16 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
解决pytorch 交叉熵损失输出为负数的问题
Jul 07 Python
浅析Python模块之间的相互引用问题
Feb 26 Python
详解Golang如何实现支持随机删除元素的堆
Sep 23 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
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
Python中的With语句的使用及原理
2020/07/29 Python
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
电大学习个人自我评价范文
2013/10/04 职场文书
影视制作岗位职责
2013/12/04 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
高一军训感想
2015/08/07 职场文书
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL