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 22 Python
利用Python实现简单的相似图片搜索的教程
Apr 23 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
Python基于opencv的图像压缩算法实例分析
May 03 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
python实现AdaBoost算法的示例
Oct 03 Python
Python第三方库安装缓慢的解决方法
Feb 06 Python
pytorch 中nn.Dropout的使用说明
May 20 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生成静态页面详解
2006/11/19 PHP
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
javascript时间差插件分享
2016/07/18 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
javascript输出AscII码扩展集中的字符方法
2016/12/26 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
使用js获取伪元素的content实例
2017/10/24 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
python实现合并两个数组的方法
2015/05/16 Python
python如何进入交互模式
2020/07/06 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
课程改革实施方案
2014/03/16 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
2014年租房协议书范本
2014/10/30 职场文书
史上最牛的辞职信
2015/02/28 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
戒赌保证书
2015/05/11 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
单位工资证明范本
2015/06/12 职场文书
通讯稿范文
2015/07/22 职场文书
《风筝》教学反思
2016/02/23 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书