zoukankan      html  css  js  c++  java
  • 增量运算符+=和*=的原理与不可变序列增量运算效率低的原因

    一、原理

    例如:

    >>> a=1
    >>> a+=1
    >>> a
    2

    在 a+=b 中

    +=背后其实是__iadd__方法,用于就地加法。

    对于可变序列(例如list、bytearray、array.array)来说,a会就地改动,类似于调用了a.extend(b一样)

    而*+取决于这个类是否实现了 __imul__方法。

    二、对于不可变序列低效原因

    >>> l=[1,2,3]
    >>> id(l)
    2613324000200
    >>> l*=2
    >>> l
    [1, 2, 3, 1, 2, 3]
    >>> id(l)
    2613324000200
    >>>

    1、可变序列进行增量运算,内存地址不变


    >>> t=(1,2,3)
    >>> id(t)
    2613324034408
    >>> t*=2
    >>> t
    (1, 2, 3, 1, 2, 3)
    >>> id(t)
    2613321738568

    2、对于不可变序列、例如元组,需要把原来对象中的元素先复制到新的对象,然后再追加新的元素。因此对不可逆序列增量运算效率低。

     str是个例外,Cpython对它进行了优化,+=字符串串接操作时,str初始化内存的时候,程序已经为str预留了可拓展空间。

  • 相关阅读:
    百度百科目录导航树小插件
    Docker for windows部署mysql挂载数据卷
    ASP.NET CORE 2.0 不小心踩得坑
    获取MVC中Controller下的Action参数异常
    DataTableToList
    svn禁止提交的文件
    plush
    解决端口号被占用的问题
    vue-router
    vue-layer
  • 原文地址:https://www.cnblogs.com/nemolmt/p/8068303.html
Copyright © 2011-2022 走看看