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使用wxPython打开并播放wav文件的方法
Apr 24 Python
python写日志封装类实例
Jun 28 Python
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
python docx 中文字体设置的操作方法
May 08 Python
python重试装饰器的简单实现方法
Jan 31 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
对Python 字典元素进行删除的方法
Jul 31 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 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 基本语法格式
2009/12/15 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
js跨域请求的5中解决方式
2015/07/02 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
动态创建类实例代码
2009/10/07 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
python实现查找所有程序的安装信息
2020/02/18 Python
HTML5拖放功能_动力节点Java学院整理
2017/07/13 HTML / CSS
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
三好学生自我鉴定
2013/12/17 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
思想品德课教学反思
2014/02/10 职场文书
《乡愁》教学反思
2014/02/18 职场文书
搞笑创意广告语
2014/03/17 职场文书
住房租房协议书
2014/08/20 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
goland 设置project gopath的操作
2021/05/06 Golang