前言:对于我这种追求极致的人来说,效率很重要。

前面看到网上关于python循环的测评,到自己在项目中的应用,发现,并不是这么回事。所以,写下次博文,一次性了解这个问题。

语言版本:python3.6

平台:mac10.12.6

IDE:pycharm community 2018.2

关于循环的介绍:

1. for循环

  我们最开始使用的循环。for循环的对象是可迭代对象。这里不详述。

2. 列表解析式

  与之类似,字典解析式,集合解析式等。

3. map循环

  与之类似有reduce,filter。这里不详述。

最终测试结果:

 map比列表解析式快一点点,

 列表解析式,大概比普通for循环快1.5倍。

 符合预期。(擦了一把汗!)

ps:有同学测试,说map速度远远大与列表推导式(大概快10000倍),这是因为他返回的是生成器对象,并没有计算出结果,所以这个不算。

以上测试,只是反映实际情况一种。并不能说这个是公理。仅仅给大家提供参考。博主不才。

测试开始:

  1. import time
  2. i = list(range(1000000)) # 生成测试序列

首先测试将数字转换成字符串:

  1. i = list(range(1000000))
    t = time.time()
  1. lt_1 = []
    for each in i:
    lt_1.append(str(each))
    t2 = time.time()
    print(t2 - t)
    lt_2 = [lambda x: str(x) for x in i]
    t3 = time.time()
    print(t3 - t2)
    lt_3 = list(map(lambda x: str(x), i))
    t4 = time.time()
    print(t4 - t3)

  结果:

0.5911688804626465
1.0817310810089111
0.7083189487457275

0.4922349452972412
1.0927751064300537
0.4922208786010742

0.5165529251098633
1.100153923034668
0.5037112236022949

结果很意外,对吧,直接采用for循环,效率比列表解析式高一倍。和网络上的教程有出入。

说明:python3 map返回的是生成器(python2 map返回列表),需要使用list来驱动他得出结果。

接下来测试计算:

  1. i = list(range(1000000))
    t = time.time()
  1. lt_1 = []
  2. for each in i:
  3. each += 1
  4. lt_1.append(each)
  5. t2 = time.time()
  6. print(t2 - t)
  7. lt_2 = [lambda x: x+1 for x in i]
  8. t3 = time.time()
  9. print(t3 - t2)
  10. lt_3 = list(map(lambda x: x+1, i))
  11. t4 = time.time()
  12. print(t4 - t3)

结果:

0.349423885345459
1.0195939540863037
0.21120715141296387

0.4159379005432129
1.1701478958129883
0.21973800659179688

0.32332897186279297
1.2796630859375
0.36236000061035156

这里能看到,map显著比for循环高,for循环比列表解析式快,这个貌似还是有些出入。

ps:对每次结果不同的解释:由于系统本身还在运行其他程序。所以,在调用python时,不可避免需要等待其他程序结束。所以会出现第三次结果的情况。

我测试了很多遍,基本结论是,map比for循环大概快1.5倍。

但是,当我把结果打印出来时,发现,列表解析式内使用lamba,返回的是<function <listcomp>.<lambda> at 0x10e154510>,不会直接返回值:所以,更新下测试代码。

  1. # -------------------------------
  2. i = list(range(1000000))
  3. t = time.time()
  4. lt_1 = []
  5. for each in i:
  6. each += 1
  7. lt_1.append(each)
  8. t2 = time.time()
  9. print(t2 - t)
  10. def ggwp(x):
  11. return x+1
  12. lt_2 = [ggwp(x) for x in i]
  13. t3 = time.time()
  14. print(t3 - t2)
  15. lt_3 = list(map(lambda x: x+1, i))
  16. t4 = time.time()
  17. print(t4 - t3)

结果:

0.32393980026245117
0.2332770824432373
0.2076709270477295

0.3169240951538086
0.23195600509643555
0.20856499671936035

0.2955038547515869
0.23477792739868164
0.20820212364196777

所以,最终结果是:map速度最快,其次是列表解析式,最后是for循环。

同样更新第一个实验的测试代码:

  1. i = list(range(1000000))
  2. t = time.time()
  3. lt_1 = []
  4. for each in i:
  5. lt_1.append(str(each))
  6. t2 = time.time()
  7. # print(lt_1)
  8. print(t2 - t)
  9. def ggwp(x):
  10. return str(x)
  11. lt_2 = [ggwp for x in i]
  12. t3 = time.time()
  13. # print(lt_2)
  14. print(t3 - t2)
  15. lt_3 = list(map(lambda x: str(x), i))
  16. t4 = time.time()
  17. # print(lt_3)
  18. print(t4 - t3)

0.5370810031890869
0.08401012420654297
0.5191819667816162

发现,这个列表解析式,效率明显高于其他2个。于是,再次修改代码。

  1. import time
    # -------------------------------
    i = list(range(1000000))
    t = time.time()
    lt_1 = []
    for each in i:
    lt_1.append(str(each))
    t2 = time.time()
    # print(lt_1)
    print(t2 - t)
    def ggwp(x):
    return str(x)
    lt_2 = [ggwp for x in i]
    t3 = time.time()
    # print(lt_2)
    print(t3 - t2)
    # lt_3 = list(map(lambda x: str(x), i))
    lt_3 = list(map(ggwp, i))
    t4 = time.time()
    # print(lt_3)
    print(t4 - t3)

0.480226993560791
0.06554508209228516
0.5108628273010254

是不是很神奇?WHY?为什么列表解析式的效率一下子提高这么多?

找到原因,因为红色的ggwp,只写了函数名。和之前的lambda类似,<function ggwp at 0x10e255488>。这个不符合要求。

修正后:

  1. lt_2 = [ggwp(x) for x in i]

0.4904050827026367
0.5147149562835693
0.49653005599975586

0.5053339004516602
0.502392053604126
0.49272894859313965

0.49378418922424316
0.4825170040130615
0.5087540149688721

发现,速度差不多。基本相同。

再来测试乘法运算:

  1. i = list(range(1000000))
    t = time.time()
    lt_1 = []
    for each in i:
    each = each*each
    lt_1.append(each)
    # print(lt_1)
    t2 = time.time()
    print(t2 - t)
    def ggwp(x):
    return x*x
    lt_2 = [ggwp(x) for x in i]
    # print(lt_2)
    t3 = time.time()
    print(t3 - t2)
    lt_3 = list(map(lambda x: x*x, i))
    # print(lt_3)
    t4 = time.time()
    print(t4 - t3)

0.5563499927520752
0.3827509880065918
0.3217048645019531

0.3309590816497803
0.21875500679016113
0.2042989730834961

0.3309590816497803
0.21875500679016113
0.2042989730834961

结果:map总体比列表解析式快一点。列表解析式大概比for循环快1.5倍。

----------------------------------------------------------------

python 几个循环的效率测试的更多相关文章

  1. Python执行效率测试模块timei的使用方法与与常用Python用法的效率比较

    timeit模块用于测试一段代码的执行效率 1.Timer类 Timer 类: __init__(stmt="pass", setup="pass", time ...

  2. python基础之循环结构以及列表

    python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.python IDE的选择 IDE的全称叫做集成 ...

  3. 第五篇:python基础之循环结构以及列表

    python基础之循环结构以及列表   python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.pyth ...

  4. Python_线程、线程效率测试、数据隔离测试、主线程和子线程

    0.进程中的概念 三状态:就绪.运行.阻塞 就绪(Ready):当进程已分配到除CPU以外的所有必要资源,只要获得处理机便可立即执行,这时的进程状态成为就绪状态. 执行/运行(Running)状态:当 ...

  5. 进程池原理及效率测试Pool

    为什么会有进程池的概念? 当我们开启50个进程让他们都将100这个数减1次减到50,你会发现特别慢! 效率问题,原因: 1,开辟内存空间.因为每开启一个进程,都会开启一个属于这个进程池的内存空间,因为 ...

  6. 关于for,while,dowhile效率测试

    引言 大家都知道每种循环对应的效率是不同的,书中都说在循环中使用减法的效率是比加法的效率高的,具体情况是怎么样,我们将详细列出各循环的执行效率问题.本文通过查看汇编代码比较各循环的效率以及i++,++ ...

  7. Python--day39--进程池原理及效率测试

    #为什么要有进程池的概念 #效率 #每次开启进程都要创建一个属于这个进程的内存空间 #寄存器 堆栈 文件 #进程过多 操作系统调度进程 # #进程池 #python中的 先创建一个属于进程的池子 #这 ...

  8. Python列表倒序输出及其效率

    Python列表倒序输出及其效率 方法一 使用Python内置函数reversed() for i in reversed(arr): pass reversed返回的是迭代器,所以不用担心内存问题. ...

  9. NHibernate Demo 和 效率测试

    本文关于NHibernate的Demo和效率测试,希望对大家有用. 1.先去官网下载Nhibernate 2.放入到项目中并建立Helper类 private static ISession _Ses ...

随机推荐

  1. 常见的Python运行时错误

    date: 2020-04-01 14:25:00 updated: 2020-04-01 14:25:00 常见的Python运行时错误 摘自 菜鸟学Python 公众号 1. SyntaxErro ...

  2. day04 Selenium请求库

    1.什么是Selenium?       Selenium是一个自动测试工具,它可以帮我通过代码去实现驱动浏览器自动执行相应的操作.       所以我们也可以用它来做爬虫.    2.为什么要适用s ...

  3. 前后端分离Java后端主流开发环境框架20200622

    开发环境: IDE:IntelliJ IDEA 2017+ DB: mysql5.7.4.PostgreSQL.mongoDB.redis JDK:JDK1.8+ Maven:Maven 3.2.3+ ...

  4. 求职时这样回答问题你就输了!来自IT类面试官视角的深度解读

    摘要:在IT工程师准备写简历时,经常会遇到这些令人头疼的问题:应届生没有实践经验:不确定哪些信息该写不该写:不知道如何在简历上展现自己的优势:不知道如何编写项目经验一栏:为了高大上写上了自己不熟悉的技 ...

  5. jquery里面的一些方法使用

    prop("属性名");  //获取属性名 prop("属性名","属性值");  //设置属性名 change(fucntion(){  ...

  6. 自己动手实现一个简单的 IOC容器

    控制反转,即Inversion of Control(IoC),是面向对象中的一种设计原则,可以用有效降低架构代码的耦合度,从对象调用者角度又叫做依赖注入,即Dependency Injection( ...

  7. webpack-从零搭建vuecli环境

    模块化思想 // 1最早期就只是html和css处理网页 // 2发明一种语言来操作html和css js // 3早期只是在html文件里直接在script标签里写一些脚本代码 // 4随着Ajax ...

  8. 样式操作-核心DOM

    1.核心DOM 只能操作行内(内嵌)样式-->style里面的所有内容(核心DOM) //麻烦获取 console.log(div.getAttribute("style") ...

  9. 企业微信公众号告警Python脚本

    #!/usr/bin/env python # -*- coding: utf-8 -*- import time import requests import json import os impo ...

  10. python数据类型之set(集合)

    set集合 关注公众号"轻松学编程"了解更多. 1.概述 set与dict类似,但set是一组key的集合,与dict的区别在于set不存储value. 本质:无序且无重复元素的集 ...