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 第一步 hello world
Sep 25 Python
Python上传package到Pypi(代码简单)
Feb 06 Python
使用python实现个性化词云的方法
Jun 16 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
Sep 05 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
wxPython色环电阻计算器
Nov 18 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
基于PyQT实现区分左键双击和单击
May 19 Python
python实现逻辑回归的示例
Oct 09 Python
Django分页器的用法你都了解吗
May 26 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动态生成JavaScript代码
2009/03/09 PHP
深入探讨PHP中的内存管理问题
2011/08/31 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
体育彩票排列三组选三算法分享
2014/03/07 PHP
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
vue小白入门教程
2018/04/02 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
wxpython实现图书管理系统
2018/03/12 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
社区八一活动方案
2014/02/03 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
国际商务专业求职信
2014/07/15 职场文书
春游踏青活动方案
2014/08/14 职场文书
会计专业求职信范文
2015/03/19 职场文书
网络研修随笔感言
2015/11/18 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python