V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
param
V2EX  ›  Python

关于 Python 中 list 添加元素的操作的效率问题

  •  
  •   param · 2018-03-20 01:42:08 +08:00 via Android · 4084 次点击
    这是一个创建于 2200 天前的主题,其中的信息可能已经有所发展或是发生改变。

    IMG 明天电脑研究一下🤔

    14 条回复    2018-03-23 01:56:59 +08:00
    ericls
        1
    ericls  
       2018-03-20 03:04:48 +08:00 via iPhone
    __iadd__ 是原地操作
    aijam
        2
    aijam  
       2018-03-20 04:22:46 +08:00 via iPhone
    “+=” is a shorthand of “ extend ”
    congeec
        3
    congeec  
       2018-03-20 05:18:09 +08:00
    m1 应该比 m2 快
    fslong
        4
    fslong  
       2018-03-20 07:15:38 +08:00 via Android
    +=。。。
    noqwerty
        5
    noqwerty  
       2018-03-20 07:16:18 +08:00


    我这边也是 m2 比 m1 要快。
    xpresslink
        6
    xpresslink  
       2018-03-20 08:09:32 +08:00   ❤️ 1
    >>> def m1(): x=[]; x.append(1)

    >>> def m2(): x=[]; x+=[1]

    >>> import dis
    >>> dis.dis(m1)
    1 0 BUILD_LIST 0
    2 STORE_FAST 0 (x)
    4 LOAD_FAST 0 (x)
    6 LOAD_ATTR 0 (append)
    8 LOAD_CONST 1 (1)
    10 CALL_FUNCTION 1
    12 POP_TOP
    14 LOAD_CONST 0 (None)
    16 RETURN_VALUE
    >>> dis.dis(m2)
    1 0 BUILD_LIST 0
    2 STORE_FAST 0 (x)
    4 LOAD_FAST 0 (x)
    6 LOAD_CONST 1 (1)
    8 BUILD_LIST 1
    10 INPLACE_ADD
    12 STORE_FAST 0 (x)
    14 LOAD_CONST 0 (None)
    16 RETURN_VALUE
    fslong
        7
    fslong  
       2018-03-20 09:26:33 +08:00
    如何回复截图?我这执行结果是正常的。
    fslong
        8
    fslong  
       2018-03-20 09:34:41 +08:00
    借用宝地测试下发图:
    代码:
    执行结果:
    个人猜测,可能是由于第一种和第二张速度差不多,执行次数少的时候收到一些随机性影响导致数据不同。
    Linxing
        9
    Linxing  
       2018-03-20 09:54:57 +08:00 via iPhone
    原来 append 最慢 我都这么➕
    jyf
        10
    jyf  
       2018-03-20 11:14:51 +08:00
    还可以考虑列表推导和.extend 这两个情况都测下

    另外列表相加那个 最好看看内存
    VYSE
        11
    VYSE  
       2018-03-20 11:30:23 +08:00
    X86

    %timeit m1()
    1000 loops, best of 3: 908 µs per loop

    %timeit m2()
    1000 loops, best of 3: 1.93 ms per loop
    linhanqiu
        12
    linhanqiu  
       2018-03-20 12:13:45 +08:00
    算上空间占用的话,区别会很大,这两种方法都不算是最优的方法。
    Ge4Los
        13
    Ge4Los  
       2018-03-20 18:25:02 +08:00   ❤️ 1
    list 默认会预留一点空间用于扩容。append 的时候如果预留空间不够,就会重新申请内存去存储。相对于 list 的长度,如果 append 了少量的元素性能会很好。
    列表生成器会直接预留足够的空间,再去填充元素。
    实际应用中,这种场景直接用列表生成式是没错的。
    param
        14
    param  
    OP
       2018-03-23 01:56:59 +08:00 via Android
    @congeec 试了好多次,m1 都不如 m2
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3991 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:20 · PVG 18:20 · LAX 03:20 · JFK 06:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.