いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Pythonメモ-125 (a=a+bとa+=bは同じ結果にはならない時もある)(list, __add__, __iadd__)

概要

以下、自分用のメモです。

以下のツイート(Xになったので今は何て呼ぶのでしょう??)を見つけました。

面白いですね。__add____iadd__ の違いでこのようになるという意味ですね。

ちなみに、__iadd__ の方は元のリストを変更するので、ベンチマークをとるとこちらの方が速いです。

試してみる

dunder_add.py

#!/usr/bin/env python

def main():
    a = [1, 2]
    for i in range(30000):
        a = a + [i]

if __name__ == '__main__':
    main()

dunder_iadd.py

#!/usr/bin/env python

def main():
    a = [1, 2]
    for i in range(30000):
        a += [i]

if __name__ == '__main__':
    main()

測定は hyperfineを使いました。

$ hyperfine "python dunder_add.py" "python dunder_iadd.py"
Benchmark 1: python dunder_add.py
  Time (mean ± σ):      1.049 s ±  0.066 s    [User: 0.849 s, System: 0.200 s]
  Range (min … max):    0.977 s …  1.205 s    10 runs

Benchmark 2: python dunder_iadd.py
  Time (mean ± σ):      14.0 ms ±   1.2 ms    [User: 12.1 ms, System: 1.9 ms]
  Range (min … max):    12.3 ms …  22.3 ms    211 runs

Summary
  python dunder_iadd.py ran
   74.83 ± 7.77 times faster than python dunder_add.py

参考情報

stackoverflow.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com