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中使用第三方库xlrd来读取Excel示例
Apr 05 Python
Python中用Decorator来简化元编程的教程
Apr 13 Python
Python内建模块struct实例详解
Feb 02 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
kafka-python批量发送数据的实例
Dec 27 Python
Python语言进阶知识点总结
May 28 Python
python hough变换检测直线的实现方法
Jul 12 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
基于Python的OCR实现示例
Apr 03 Python
tensorflow实现从.ckpt文件中读取任意变量
May 26 Python
python使用布隆过滤器的实现示例
Aug 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
Array of country list in PHP with Zend Framework
2011/10/17 PHP
php+js实现异步图片上传实例分享
2014/06/02 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
JS 面向对象之神奇的prototype
2011/02/26 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
javascript生成大小写字母
2015/07/03 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
英文版餐饮业求职信
2013/10/18 职场文书
汽车工程专业应届生求职信
2013/10/19 职场文书
消防器材管理制度
2014/01/28 职场文书
七年级历史教学反思
2014/02/05 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
行政介绍信范文
2015/05/04 职场文书
电工实训心得体会
2016/01/14 职场文书