読者です 読者をやめる 読者になる 読者になる

append, extend

Python

伝聞によって知った話なのでよく分からないのですが、ものすごく気になります。

listのappendは毎回list objectを作り直すらしい。それextend

http://d.hatena.ne.jp/tasukuchan/20070630/1183170786

「毎回list objectを作り直す」というのはどういうことなのでしょうか?


CPythonのソースコードだと、Objects/listobject.cのlist_resizeがその実装にあたると思います。PyList_Appendや_PyList_Extendは、すでにメモリを確保済みの場合は、PyList_SET_ITEMマクロを呼ぶだけなのでたいした仕事をしていない。


この実装は、realloc()のコストを避け、0, 4, 8, 16, 25...のようにリストの長さに応じて次に確保するメモリ量を増加していく、ごく普通の"Vector"の実装のようにように見えます。僕のソースコードの読み間違えか、あるいはymasudaさんの論点は別のところにあるのでしょうか?「リストに複数の要素を追加するならば、extendの方がよい」という意味ならばその通りだと思いますが。