栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

比较列表推导和显式循环(3个数组生成器比1个循环快)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

比较列表推导和显式循环(3个数组生成器比1个循环快)

让我们定义回答问题并为其计时所需的功能:

In [18]: def iter():    l = [x for x in range(100) if x > 10]   ....:In [19]: %timeit iter()100000 loops, best of 3: 7.92 µs per loopIn [20]: def loop():    l = []    for x in range(100):        if x > 10: l.append(x)   ....:In [21]: %timeit loop()10000 loops, best of 3: 20 µs per loopIn [22]: def loop_fast():    l = []    for x in range(100):        if x > 10: pass   ....:In [23]: %timeit loop_fast()100000 loops, best of 3: 4.69 µs per loop

我们可以看到,没有append命令的for循环与列表理解一样快。实际上,如果我们看一下字节码,就会发现在列表理解的情况下,python能够使用名为LIST_APPEND的内置字节码命令来代替:

  • 加载列表:40 LOAD_FAST
  • 加载属性:43 LOAD_ATTRIBUTE
  • 调用已加载的函数:49 CALL_FUNCTION
  • 卸载列表(?):52 POP_TOP

从输出下面可以看到,列表理解和“ loop_fast”函数缺少前一个字节码。比较这三个函数的时间很明显,它们负责三种方法的不同时序。

In [27]: dis.dis(iter)  2          0 BUILD_LIST  0  3 LOAD_GLOBAL 0 (range)  6 LOAD_ConST  1 (1)  9 LOAD_ConST  2 (100) 12 CALL_FUNCTION          2 15 GET_ITER       >>   16 FOR_ITER   24 (to 43) 19 STORE_FAST  0 (x) 22 LOAD_FAST   0 (x) 25 LOAD_ConST  2 (100) 28 COMPARE_OP  4 (>) 31 POP_JUMP_IF_FALSE     16 34 LOAD_FAST   0 (x) 37 LIST_APPEND 2 40 JUMP_ABSOLUTE         16       >>   43 STORE_FAST  1 (l) 46 LOAD_ConST  0 (None) 49 RETURN_VALUEIn [28]: dis.dis(loop)  2          0 BUILD_LIST  0  3 STORE_FAST  0 (1)  3          6 SETUP_LOOP 51 (to 60)  9 LOAD_GLOBAL 0 (range) 12 LOAD_ConST  1 (1) 15 LOAD_ConST  2 (100) 18 CALL_FUNCTION          2 21 GET_ITER       >>   22 FOR_ITER   34 (to 59) 25 STORE_FAST  1 (x)  4         28 LOAD_FAST   1 (x) 31 LOAD_ConST  3 (10) 34 COMPARE_OP  4 (>) 37 POP_JUMP_IF_FALSE     22  5         40 LOAD_FAST   0 (l) 43 LOAD_ATTR   1 (append) 46 LOAD_FAST   1 (x) 49 CALL_FUNCTION          1 52 POP_TOP 53 JUMP_ABSOLUTE         22 56 JUMP_ABSOLUTE         22       >>   59 POP_BLOCK       >>   60 LOAD_ConST  0 (None) 63 RETURN_VALUEIn [29]: dis.dis(loop_fast)  2          0 BUILD_LIST  0  3 STORE_FAST  0 (1)  3          6 SETUP_LOOP 38 (to 47)  9 LOAD_GLOBAL 0 (range) 12 LOAD_ConST  1 (1) 15 LOAD_ConST  2 (100) 18 CALL_FUNCTION          2 21 GET_ITER       >>   22 FOR_ITER   21 (to 46) 25 STORE_FAST  1 (x)  4         28 LOAD_FAST   1 (x) 31 LOAD_ConST  3 (10) 34 COMPARE_OP  4 (>) 37 POP_JUMP_IF_FALSE     22  5         40 JUMP_ABSOLUTE         22 43 JUMP_ABSOLUTE         22       >>   46 POP_BLOCK       >>   47 LOAD_ConST  0 (None) 50 RETURN_VALUE


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/641060.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号