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实现读取并保存文件的类
May 11 Python
python中数据爬虫requests库使用方法详解
Feb 11 Python
JavaScript实现一维数组转化为二维数组
Apr 17 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
python 随机打乱 图片和对应的标签方法
Dec 14 Python
Python一个简单的通信程序(客户端 服务器)
Mar 06 Python
python 弹窗提示警告框MessageBox的实例
Jun 18 Python
Django 自动生成api接口文档教程
Nov 19 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 Python
2021年pycharm的最新安装教程及基本使用图文详解
Apr 03 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 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/05/16 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
PHP实现简易图形计算器
2020/08/28 PHP
原创javascript小游戏实现代码
2010/08/19 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
python创建n行m列数组示例
2019/12/02 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
用Python实现职工信息管理系统
2020/12/30 Python
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
给女儿的表扬信
2014/01/18 职场文书
畜牧兽医本科生的自我评价
2014/03/03 职场文书
专业见习报告范文
2014/11/03 职场文书
父亲节活动总结
2015/02/12 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
关于Python使用turtle库画任意图的问题
2022/04/01 Python
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL