python 几个循环的效率测试
前言:对于我这种追求极致的人来说,效率很重要。
前面看到网上关于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倍),这是因为他返回的是生成器对象,并没有计算出结果,所以这个不算。
以上测试,只是反映实际情况一种。并不能说这个是公理。仅仅给大家提供参考。博主不才。
测试开始:
import time
i = list(range(1000000)) # 生成测试序列
首先测试将数字转换成字符串:
i = list(range(1000000))
t = time.time()
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来驱动他得出结果。
接下来测试计算:
i = list(range(1000000))
t = time.time()
lt_1 = []
for each in i:
each += 1
lt_1.append(each)
t2 = time.time()
print(t2 - t)
lt_2 = [lambda x: x+1 for x in i]
t3 = time.time()
print(t3 - t2)
lt_3 = list(map(lambda x: x+1, i))
t4 = time.time()
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>,不会直接返回值:所以,更新下测试代码。
# -------------------------------
i = list(range(1000000))
t = time.time()
lt_1 = []
for each in i:
each += 1
lt_1.append(each)
t2 = time.time()
print(t2 - t)
def ggwp(x):
return x+1
lt_2 = [ggwp(x) for x in i]
t3 = time.time()
print(t3 - t2)
lt_3 = list(map(lambda x: x+1, i))
t4 = time.time()
print(t4 - t3)
结果:
0.32393980026245117
0.2332770824432373
0.2076709270477295
0.3169240951538086
0.23195600509643555
0.20856499671936035
0.2955038547515869
0.23477792739868164
0.20820212364196777
所以,最终结果是:map速度最快,其次是列表解析式,最后是for循环。
同样更新第一个实验的测试代码:
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))
t4 = time.time()
# print(lt_3)
print(t4 - t3)
0.5370810031890869
0.08401012420654297
0.5191819667816162
发现,这个列表解析式,效率明显高于其他2个。于是,再次修改代码。
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>。这个不符合要求。
修正后:
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
发现,速度差不多。基本相同。
再来测试乘法运算:
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 几个循环的效率测试的更多相关文章
- Python执行效率测试模块timei的使用方法与与常用Python用法的效率比较
timeit模块用于测试一段代码的执行效率 1.Timer类 Timer 类: __init__(stmt="pass", setup="pass", time ...
- python基础之循环结构以及列表
python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.python IDE的选择 IDE的全称叫做集成 ...
- 第五篇:python基础之循环结构以及列表
python基础之循环结构以及列表 python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.pyth ...
- Python_线程、线程效率测试、数据隔离测试、主线程和子线程
0.进程中的概念 三状态:就绪.运行.阻塞 就绪(Ready):当进程已分配到除CPU以外的所有必要资源,只要获得处理机便可立即执行,这时的进程状态成为就绪状态. 执行/运行(Running)状态:当 ...
- 进程池原理及效率测试Pool
为什么会有进程池的概念? 当我们开启50个进程让他们都将100这个数减1次减到50,你会发现特别慢! 效率问题,原因: 1,开辟内存空间.因为每开启一个进程,都会开启一个属于这个进程池的内存空间,因为 ...
- 关于for,while,dowhile效率测试
引言 大家都知道每种循环对应的效率是不同的,书中都说在循环中使用减法的效率是比加法的效率高的,具体情况是怎么样,我们将详细列出各循环的执行效率问题.本文通过查看汇编代码比较各循环的效率以及i++,++ ...
- Python--day39--进程池原理及效率测试
#为什么要有进程池的概念 #效率 #每次开启进程都要创建一个属于这个进程的内存空间 #寄存器 堆栈 文件 #进程过多 操作系统调度进程 # #进程池 #python中的 先创建一个属于进程的池子 #这 ...
- Python列表倒序输出及其效率
Python列表倒序输出及其效率 方法一 使用Python内置函数reversed() for i in reversed(arr): pass reversed返回的是迭代器,所以不用担心内存问题. ...
- NHibernate Demo 和 效率测试
本文关于NHibernate的Demo和效率测试,希望对大家有用. 1.先去官网下载Nhibernate 2.放入到项目中并建立Helper类 private static ISession _Ses ...
随机推荐
- ElasticSearch详细笔记
ElasticSearch详细笔记 什么是ElasticSearch Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Luce ...
- E. Tree Queries 解析(思維、LCA)
Codeforce 1328 E. Tree Queries 解析(思維.LCA) 今天我們來看看CF1328E 題目連結 題目 給你一棵樹,並且給你\(m\le2e5\)個詢問(包含\(k\)個點) ...
- SQL Server 列存储索引 第三篇:维护
列存储索引分为两种类型:聚集的列存储索引和非聚集的列存储索引,在一个表上只能创建一个聚集索引,要么是聚集的列存储索引,要么是聚集的行存储索引,然而一个表上可以创建多个非聚集索引. 一,创建列存储索引 ...
- vue-cli @4安装
10月16日,官方发布消息称Vue-cli 4.0正式版发布,安装和vue-cli3.0的是一模一样的,与3.0的脚手架,除了目录发生变化一些,其他的都一样,由于近期才推出,企业中还在使用3.0,但是 ...
- dcoker 搭建单节点redis
1.安装docker 1.检查内核版本,必须是3.10及以上 [root@localhost ~]# uname -r 2.安装docker [root@localhost ~]# yum insta ...
- 关于windows下redis的安装
1.下载地址:https://github.com/MSOpenTech/redis/releases 2.DOS下进redis文件夹目录,执行redis-server.exe redis.windo ...
- SAP S/4HANA 2020安装实录
欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 今天开始试着安装SAP S/4HANA 2020版本,也是目前SAP ERP最高的版本,总安装文件大小大概50GB,数据库版本必须是HANA ...
- AQS源码深入分析之条件队列-你知道Java中的阻塞队列是如何实现的吗?
本文基于JDK-8u261源码分析 1 简介 因为CLH队列中的线程,什么线程获取到锁,什么线程进入队列排队,什么线程释放锁,这些都是不受我们控制的.所以条件队列的出现为我们提供了主动式地.只有满足指 ...
- Hill密码解密过程(Java)
Hill密码是一种传统的密码体系.加密原理:选择一个二阶可逆整数矩阵A称为密码的加密矩阵,也就是这个加密体系的密钥.加密过程: 明文字母依次逐对分组,例如加密矩阵为二阶矩阵,明文就两个字母一组,如果最 ...
- tensorflow-gpu2.1.0报错 so returning NUMA node zero解决办法
>>> print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))2020-06-06 10:14:08.92 ...