4

del a[0]を模倣するために単純なリストを使用しようとしていdeque.popleft()ます。delPython での動作を理解したいだけです。例えば:

a = [0,1,2,3,4,5]

aメモリ内の連続空間にあります。を呼び出した後del a[0]、Python は新しいスペースを割り当て1,2,3,4,5てそこにコピーするか、新しいアドレスを与えるだけaです (これは と同じa = a[1:]です)。

新しいスペースを割り当てる場合、それdel a[0]は _O (len (a) _ 操作ですか?

del a[0]が と同じ場合a = a[1:]、Python は配列から削除されたメモリ空間を再利用しますか?

4

1 に答える 1

5

この回答を参照してください: Python のリストはどのように実装されていますか?

Python のリストは、基本的にポインターの配列です。そのため、先頭から削除すると、リスト全体のすべての要素が同じメモリ空間内の新しい位置にシャッフルされますが、リスト全体は、各要素が実際にリストに格納されている場合に予想されるよりもはるかに小さいため、シャッフル一定の時間コストに関しては、はるかに高速です。

しかし、確かにdel a[0]O(len(a)) 操作であり、それがdeque存在する理由です。

メモリの再割り当てに関しては、興味深いことに、要素を削除しても、要素のメモリ空間がすぐに解放されるとは限りません。リストは、特定のしきい値でサイズを増減して、メモリ割り当て要求をより効率的にし、メモリの断片化を最適化します。

編集: このブログ投稿で詳細を説明しています

明確化:以前の投稿では、リスト全体のメモリ位置が同じであることは説明されていませんでしたが、各要素がシャッフルされ、一部のメモリの割り当てが解除された可能性があります。

于 2015-01-08T07:57:18.993 に答える