美文网首页
为什么列表推导式会更快

为什么列表推导式会更快

作者: 泡泡坪 | 来源:发表于2018-11-03 20:47 被阅读8次

你一定听过这样一个说法,尽量使用列表推导式,而不是用list.append方法来初始化一个列表,那么究竟为何列表推导式会更快呢?

这是因为,列表推导式被编译后的字节码执行速度更快。python当然不是一门编译型语言,但是它还是要被解析成二进制的字节码才能被执行,执行它的正是python解释器。

2、dis
这个模块原生的代码分析模块,通过它,我们可以查看python代码被编译后的字节码

3、示例

# coding=utf-8
import dis

def func1():
    lst = []
    for i in xrange(100):
        lst.append(lst)

def func2():
    lst = [i for i in xrange(100)]

dis.dis(func1)
print '*'*20
dis.dis(func2)

执行上面这段代码,输出内容为

  6           0 BUILD_LIST               0
              3 STORE_FAST               0 (lst)

  7           6 SETUP_LOOP              33 (to 42)
              9 LOAD_GLOBAL              0 (xrange)
             12 LOAD_CONST               1 (100)
             15 CALL_FUNCTION            1
             18 GET_ITER            
        >>   19 FOR_ITER                19 (to 41)
             22 STORE_FAST               1 (i)

  8          25 LOAD_FAST                0 (lst)
             28 LOAD_ATTR                1 (append)
             31 LOAD_FAST                0 (lst)
             34 CALL_FUNCTION            1
             37 POP_TOP             
             38 JUMP_ABSOLUTE           19
        >>   41 POP_BLOCK           
        >>   42 LOAD_CONST               0 (None)
             45 RETURN_VALUE        
********************
 12           0 BUILD_LIST               0
              3 LOAD_GLOBAL              0 (xrange)
              6 LOAD_CONST               1 (100)
              9 CALL_FUNCTION            1
             12 GET_ITER            
        >>   13 FOR_ITER                12 (to 28)
             16 STORE_FAST               0 (i)
             19 LOAD_FAST                0 (i)
             22 LIST_APPEND              2
             25 JUMP_ABSOLUTE           13
        >>   28 STORE_FAST               1 (lst)
             31 LOAD_CONST               0 (None)
             34 RETURN_VALUE

这就是两个函数各自的字节码,这些命令的解释,可以在官方文档中查看 ,地址:https://docs.python.org/2/library/dis.html

对比一下,不难发现,两个段字节码最大的区别在于添加元素的部分

func1 中,先要LOAD_ATTR,将append方法加载进来,然后CALL_FUNCTION,也就是执行

而在func2中,则直接调用了LIST_APPEND命令来添加元素,就是这一个小小的区别,使得列表推导式的速度会更快,因为func1相比于func2多了一个LOAD_ATTR的过程,要明白,这条命令在每次循环中都会被执行,一旦循环的次数多起来,就必然拖慢速度
引用:http://www.zhangdongshengtech.com/article-detials/211

相关文章

网友评论

      本文标题:为什么列表推导式会更快

      本文链接:https://www.haomeiwen.com/subject/hvllxqtx.html