python 列表推导 为什么快_python 列表推导 为什么快
匿名用户
1级
2016-07-22 回答
首先肯定 map 和列表推导效率确实会比循环的高,
先说列表推导,下边是我在 ipython 里的测试结果(测试环境 Python 2.7.10):
>>> long_list = range(1000)
>>> a = []
>>> %timeit for i in long_list: a.append(i+1)
10000 loops, best of 3: 100 µs per loop
>>> %timeit [i+1 for i in long_list]
10000 loops, best of 3: 43.3 µs per loop
可以看出列表推导还是要快过 for 循环的。
那为什么列表推导会快呢?我们直接调用 python 的 dis 模块去看看他的字节码:
这个是列表推导那一行代码的字节码:
0 BUILD_LIST 0
3 LOAD_GLOBAL 0 (long_list)
6 GET_ITER
>> 7 FOR_ITER 16 (to 26)
10 STORE_FAST 0 (i)
13 LOAD_FAST 0 (i)
16 LOAD_CONST 1 (1)
19 BINARY_ADD
20 LIST_APPEND 2
23 JUMP_ABSOLUTE 7
...
这个是 for 循环那一行的字节码:
6 SETUP_LOOP 31 (to 40)
9 LOAD_GLOBAL 0 (long_list)
12 GET_ITER
>> 13 FOR_ITER 23 (to 39)
16 STORE_FAST 1 (i)
19 LOAD_FAST 0 (a)
22 LOAD_ATTR 1 (append)
25 LOAD_FAST 1 (i)
28 LOAD_CONST 1 (1)
31 BINARY_ADD
32 CALL_FUNCTION 1
35 POP_TOP
36 JUMP_ABSOLUTE 13
...
对比一下不难发现其实列表推导和 for 循环的过程几乎是一样的,除了如何append。所以你要说他是语法糖也不是不行……
在
列表推导中直接使用了‘LIST_APPEND’这个字节码来实现 append 功能,效率相当的高。而在 for 循环中每次循环都要先载入
append 这个属性然后再 ‘CALL_FUNCTION’一下。这样势必就会慢了很多。为了验证我们的猜想,我们把 append
这个函数存到局部变量里去:
>>> a = []
>>> invoke = a.append
>>> %timeit for i in long_list: invoke(i+1)
10000 loops, best of 3: 67.2 µs per loop
发现没有比前一个版本的 for 循环快了接近40%,剩下的多出来20多 µs 的开销自然就是‘CALL_FUNCTION’的开销咯 ╮(╯_╰)╭。
相信到这里你应该明白了为什么列表推导要比 for 循环快吧,秘诀就在这个‘LIST_APPEND’这个字节码上,相当于你直接调用了 C 语言版本的函数(不严谨)而且越过了一些中间步骤。
接下来简单说说 map 的事情,直接使用 map 一般来说是要比循环快的,但有的时候情况会比较诡异,例如:
>>> %timeit for i in long_list: a.append(i+1)
10000 loops, best of 3: 100 µs per loop
>>> %timeit map(lambda x: x+1, long_list)
10000 loops, best of 3: 109 µs per loop
别急,我们把 map 的写法改成这样:
>>> int_object = 1
>>> %timeit map(int_object.__add__, long_list)
10000 loops, best of 3: 41.6 µs per loop
于是神奇的事情出现了!基本上和列表推导一样快!(⊙o⊙)
这个主要是因为 lambda
表达式生成的函数是 Python 的,而直接用+运算符或者__add__方法调用的是 C 版本的。你要是把列表推导里边的+换成 lambda
表达式两者的速度差不多,map 一般来说还要快上一点点。本质上来说 map 调用了底层的 C 函数所以速度自然是快的。粗暴的总结一下就是不用
lambda 的时候 map 要快一些
python 列表推导 为什么快_python 列表推导 为什么快相关推荐
- python列表解析式如何使用_python列表推导式操作解析
python列表推导式操作解析 这篇文章主要介绍了python列表推导式操作解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基本格式 [表达式 ...
- python列表的实现原理_python列表推导式原理和使用方法
偶尔会在python中看见这样一行代码: data = [x**2 for x in range(0, 5)] # 此时data = [0, 1, 4, 9, 16] 如果不知道背后的语法规则,那么很 ...
- 列表输出循环左移_python 列表推导式(经典代码)(21)
文章首发微信公众号,微信搜索:猿说python 截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率 ...
- python列表定义和操作_Python 列表的定义及操作
#列表概念:有序的可变的元素集合 #定义#直接定义 nums = [1,2,3,4,5]#通过range函数构造,python2 和python3 版本之间的差异:#python3 用的时候才会去构造 ...
- python列表增删改查_Python列表List增删改查、拷贝
列表的介绍 一.什么是列表 列表是可以存储不同类型数据的有序.可变的存储容器. 二.列表的格式 定义列的格式: [元素1,元素2,元素3,...,元素n] 定义变量名为arr的列表 arr=[1,'你 ...
- python列表字典的区别_python列表和字典区别
列表 1.任意对象的有序集合 列表是一组任意类型的值,按照一定顺序组合而成的 2.通过偏移读取 组成列表的值叫做元素(Elements).每一个元素被标识一个索引,第一个索引是0,序列的功能都能实现 ...
- python中append的用法_Python 列表 append() 使用方法及示例
Python 列表 append() 使用方法及示例 append()方法将一个项目添加到列表的末尾. append()方法将单个项目添加到列表的末尾. append()方法的语法为:list.app ...
- python列表的实现原理_Python列表对象实现原理
Python 列表对象实现原理 Python 中的列表基于 PyListObject 实现,列表支持元 素的插入.删除.更新操作,因此 PyListObject 是一个变长 对象(列表的长度随着元素的 ...
- python列表操作函数大全_Python列表操作函数
列表可以进行多个数据的存储,同时python中的列表设计非常到位,它可以实现内容动态扩充,可以进行后期数据的删除,这些就需要通过Python提供的列表操作函数来实现了. 对于Python语言而言,开发 ...
- python列表有哪些操作_python列表的基本操作有哪些
python列表的基本操作有:1.创建列表,只要把逗号分隔的不同的数据项使用方括号括起来:2.添加新的元素:3.遍历列表:4.访问列表中的值:5.从list删除元素. 相关免费学习推荐:python教 ...
最新文章
- 解释一下c语言 for(;;) printf(*);,printf()函数的一个问题
- VS可视化调试学习总结
- grub安装的 三种安装方式
- 机房安防系统常见故障原因及处理方法
- Kafka分区分配策略(4)——分配的实施
- koa2入门(3)mongoose 增删改查
- 前端基础-git(二):轻松搞定git创建仓库,操作仓库内容
- Kafka消息压缩与解压
- 佳士得于5月19日至27日以NFT形式拍卖安迪·沃霍尔作品
- 阿里云服务器centos7 安装docker 和docker-compose 及相关命令
- JAVA——算法训练 调和数列问题
- 四象限时间管理有多好用?
- 【直线检测】基于LSD实现直线检测含Matlab源码
- 怎么在工作中快速学习,获得晋升?——吴军得到直播实录
- 人工智能Java SDK:声纹识别
- sqlsever2008 函数
- NNDL 2022秋
- android动画知乎,GitHub - ryanhoo/Zhihu-Parallax-Animation: 知乎 Android 客户端启动页的视差动画效果实现...
- 关于XML解析的常用方式
- Up in the Air-3