Fork me on GitHub

增量运算符+=和*=的原理与不可变序列增量运算效率低的原因

一、原理

例如:

>>> 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预留了可拓展空间。

posted @ 2017-12-19 23:34  流氓兔Nemo  阅读(431)  评论(0编辑  收藏  举报