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 相关文章推荐
浅谈Django REST Framework限速
Dec 12 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
利用python修改json文件的value方法
Dec 31 Python
python3.6实现学生信息管理系统
Feb 21 Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 Python
python字典一键多值实例代码分享
Jun 14 Python
python批量下载抖音视频
Jun 17 Python
python 默认参数相关知识详解
Sep 18 Python
将python安装信息加入注册表的示例
Nov 20 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
Python自动操作神器PyAutoGUI的使用教程
Jun 16 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多例模式介绍
2013/06/24 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
2013/08/07 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
python安装教程 Pycharm安装详细教程
2017/05/02 Python
Python流程控制 if else实现解析
2019/09/02 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
办理退休介绍信
2014/01/09 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
销售口号大全
2014/06/11 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
投资合作意向书范本
2015/05/08 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js