通常の操作の過程で、Python は多数の小さなタプルを作成および破棄するため、Python はその目的のために小さなタプルの内部キャッシュを保持します。これにより、多くのメモリ割り当てと割り当て解除のチャーンを削減できます。同じ理由で、-5 から 255 までの小さい整数がインターンされます (シングルトンにされます)。
PyTuple_MAXSAVESIZE
定義は、この最適化の対象となるタプルの最大サイズを制御し、定義PyTuple_MAXFREELIST
は、これらのタプルのうちのいくつをメモリ内に保持するかを制御します。長さ < のタプルが破棄されると、Python が新しい小さなタプルを作成するときに再利用できるようにPyTuple_MAXSAVESIZE
( で) まだ 1 つの余地があれば、フリー リストに追加されます ( で)。tupledealloc
PyTuple_New
Python は、これらをどのように格納するかについて少し巧妙です。長さ > 0 のタプルごとに、キャッシュされた各タプルの最初の要素を再利用して、タプルを連鎖さPyTuple_MAXFREELIST
せてリンク リストにします。したがって、free_list
配列内の各要素は Python タプル オブジェクトのリンク リストであり、そのようなリンク リスト内のすべてのタプルは同じサイズです。唯一の例外は空のタプル (長さ 0) です。これらのうち 1 つだけが必要であり、それはシングルトンです。
したがって、そうです、長さを超えるタプルの場合、PyTuple_MAXSAVESIZE
python は新しい C 構造体に個別にメモリを割り当てる必要があることが保証されており、そのようなタプルを頻繁に作成および破棄すると、パフォーマンスに影響を与える可能性があります。
Python C の内部構造を理解したい場合は、Python C APIを学習することをお勧めします。Python が C でオブジェクト、関数、およびメソッドを定義するために使用するさまざまな構造を理解しやすくなります。