匿名用户

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 列表推导 为什么快相关推荐

  1. python列表解析式如何使用_python列表推导式操作解析

    python列表推导式操作解析 这篇文章主要介绍了python列表推导式操作解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基本格式 ​[表达式 ...

  2. python列表的实现原理_python列表推导式原理和使用方法

    偶尔会在python中看见这样一行代码: data = [x**2 for x in range(0, 5)] # 此时data = [0, 1, 4, 9, 16] 如果不知道背后的语法规则,那么很 ...

  3. 列表输出循环左移_python 列表推导式(经典代码)(21)

    文章首发微信公众号,微信搜索:猿说python 截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率 ...

  4. python列表定义和操作_Python 列表的定义及操作

    #列表概念:有序的可变的元素集合 #定义#直接定义 nums = [1,2,3,4,5]#通过range函数构造,python2 和python3 版本之间的差异:#python3 用的时候才会去构造 ...

  5. python列表增删改查_Python列表List增删改查、拷贝

    列表的介绍 一.什么是列表 列表是可以存储不同类型数据的有序.可变的存储容器. 二.列表的格式 定义列的格式: [元素1,元素2,元素3,...,元素n] 定义变量名为arr的列表 arr=[1,'你 ...

  6. python列表字典的区别_python列表和字典区别

    列表 1.任意对象的有序集合 列表是一组任意类型的值,按照一定顺序组合而成的 2.通过偏移读取 组成列表的值叫做元素(Elements).每一个元素被标识一个索引,第一个索引是0,序列的功能都能实现 ...

  7. python中append的用法_Python 列表 append() 使用方法及示例

    Python 列表 append() 使用方法及示例 append()方法将一个项目添加到列表的末尾. append()方法将单个项目添加到列表的末尾. append()方法的语法为:list.app ...

  8. python列表的实现原理_Python列表对象实现原理

    Python 列表对象实现原理 Python 中的列表基于 PyListObject 实现,列表支持元 素的插入.删除.更新操作,因此 PyListObject 是一个变长 对象(列表的长度随着元素的 ...

  9. python列表操作函数大全_Python列表操作函数

    列表可以进行多个数据的存储,同时python中的列表设计非常到位,它可以实现内容动态扩充,可以进行后期数据的删除,这些就需要通过Python提供的列表操作函数来实现了. 对于Python语言而言,开发 ...

  10. python列表有哪些操作_python列表的基本操作有哪些

    python列表的基本操作有:1.创建列表,只要把逗号分隔的不同的数据项使用方括号括起来:2.添加新的元素:3.遍历列表:4.访问列表中的值:5.从list删除元素. 相关免费学习推荐:python教 ...

最新文章

  1. 解释一下c语言 for(;;) printf(*);,printf()函数的一个问题
  2. VS可视化调试学习总结
  3. grub安装的 三种安装方式
  4. 机房安防系统常见故障原因及处理方法
  5. Kafka分区分配策略(4)——分配的实施
  6. koa2入门(3)mongoose 增删改查
  7. 前端基础-git(二):轻松搞定git创建仓库,操作仓库内容
  8. Kafka消息压缩与解压
  9. 佳士得于5月19日至27日以NFT形式拍卖安迪·沃霍尔作品
  10. 阿里云服务器centos7 安装docker 和docker-compose 及相关命令
  11. JAVA——算法训练 调和数列问题
  12. 四象限时间管理有多好用?
  13. 【直线检测】基于LSD实现直线检测含Matlab源码
  14. 怎么在工作中快速学习,获得晋升?——吴军得到直播实录
  15. 人工智能Java SDK:声纹识别
  16. sqlsever2008 函数
  17. NNDL 2022秋
  18. android动画知乎,GitHub - ryanhoo/Zhihu-Parallax-Animation: 知乎 Android 客户端启动页的视差动画效果实现...
  19. 关于XML解析的常用方式
  20. Up in the Air-3

热门文章

  1. 2019 Java发展趋势报告:Java老矣,Java正年轻
  2. 配置Tomcat使用https协议(配置SSL协议)
  3. jeecg-easypoi-2.0.3版本发布
  4. 基于微信我们可以做什么样的应用?
  5. 【JEECG-Mybatis版本】springmvc+mybatis+代码生成器(代码一键生成)
  6. Java并发编程(01):线程的创建方式,状态周期管理
  7. PDM 物理模型codename转大写
  8. SQL查询环比增长 前后行数据对比操作
  9. Android开源源码推荐(一)
  10. 生活在信息世界,人人都该懂得大数据概念