Pythonソースコード分析-リストとタプルの内部実装

Pythonソースコード分析-リストとタプルの内部実装

リストの内部実装

listobject.h:https://github.com/python/cpython/blob/949fe976d5c62ae63ed505ecf729f815d0baccfc/Include/listobject.h#L23

listobject.c:https://github.com/python/cpython/blob/3d75bd15ac82575967db367c517d7e6e703a6de3/Objects/listobject.c#L33

リストの特定の構造:

listc

Pythonのソースコードから、リストの本質が過剰割り当て配列であることは明らかです。(たとえば、配列に5つの要素がある場合、実際の要素よりも多くのスペースが割り当てられますが、割り当てが多すぎると、10の要素にスペースが割り当てられる可能性があります)

その中で、ob_itemはポインタのリストであり、その中の各ポインタはリストの要素を指し、allocateはこのリストに割り当てられたスペースのサイズを格納します。

割り当てられた実際のスペースサイズとリストには違いがあることに注意してください。リストの実際のスペースサイズは、ソースコードでコメント化されたib_sizeであるlen(list)の戻り値で表示できます。これは、リストに格納されている要素の数を示します。実際の状況では、ストレージ構造を最適化し、要素が追加されるたびにメモリが割り当てられないようにするために、allcoatedリストの事前に割り当てられたスペースはob_size(ソースコード)より大きくなります。 31行目)

したがって、それらの関係は次のようになります。割り当て済み> = ob_size ie len(list)> = 0

現在のリストが完全に割り当てられると、システムからより多くのメモリスペースを要求し、元のすべての要素をコピーします。リストがスペースを割り当てるたびに、次のパターンに従います。

 
ob_size = 0
allocated = 0

print(allocated, end=" ")
for item in range(100):
    ob_size += 1
    if ob_size > allocated:
        allocated = ob_size + (ob_size >> 3) + (3 if ob_size < 9 else 6)
        print(allocated, end=" ")
# 0 4 8 16 25 35 46 58 72 88 106 ···

タプルの内部実装

tupleobject.h:https://github.com/python/cpython/blob/3d75bd15ac82575967db367c517d7e6e703a6de3/Include/tupleobject.h#L25

tupleobject.c:https://github.com/python/cpython/blob/3d75bd15ac82575967db367c517d7e6e703a6de3/Objects/tupleobject.c#L16

タプルの特定の構造:

c

ソースコードから、タプルとエッセンスも配列ですが、スペースサイズは固定されています。プログラムの効率を改善するために、Pythonにはタプルの多くの最適化があります。

タプル静的リソースキャッシュ

インデックスを介して要素を検索する場合、リストとタプルはどちらも同じですが、辞書のキーとしてのタプルに加えて、別の機能があります。一方で、その不変性のために、割り当て速度が非常に高速です。 、一方、1つの理由は、静的リソースキャッシュとしても機能することです。

タプルなどの一部の静的変数では、使用されていないか、スペースをほとんどとらない場合、Pythonはメモリのこの部分を一時的にキャッシュするため、次回同じサイズのタプルを再度作成すると、Pythonは動作しなくなります。システムは要求を送信してメモリを要求しますが、以前にキャッシュされたメモリスペースを直接割り当てます。これにより、プログラムの実行速度が大幅に向上します。

PyTupleObjectオブジェクトが破棄されると、オブジェクト自体がリサイクルされないだけでなく、基になるポインタ配列もキャッシュされることが理解できます






ブログ投稿のフォローアップ更新については、私の個人ブログをフォローしてください:Stardust Blog

おすすめ

転載: blog.csdn.net/u011130655/article/details/113019089