Copy on Write#
Copy on Write(CoW)は、インデックス作成APIを簡素化し、可能な場合はコピーを回避することでパフォーマンスを向上させるメカニズムです。CoWは、別のDataFrameまたはSeriesから何らかの方法で派生したDataFrameまたはSeriesが常にコピーとして動作することを意味します。Copy on Writeを効率的に使用する方法については、こちらを参照してください。
参照追跡#
DataFrameへの書き込み時にコピーを作成する必要があるかどうかを判断するには、値が別のDataFrameと共有されているかどうかを認識している必要があります。pandasは、コピーをトリガーする必要がある時期を判断できるように、値を内部的に別のブロックと共有するすべてのBlocksを追跡します。参照追跡メカニズムはブロックレベルで実装されています。
カスタム参照トラッカーオブジェクトBlockValuesRefsを使用します。これは、相互にメモリを共有するすべてのブロックを追跡します。参照は弱参照を介して保持されます。メモリの一部を共有するすべてのブロックペアは、同じBlockValuesRefsオブジェクトを指す必要があります。1つのブロックがスコープ外になると、このブロックへの参照はなくなります。結果として、参照トラッカーオブジェクトは常に、いくつのブロックがアクティブでメモリを共有しているかを知っています。
DataFrameまたはSeriesオブジェクトが別のオブジェクトとデータを共有している場合、それらの各オブジェクトが独自のBlockManagerとBlockオブジェクトを持っている必要があります。つまり、別の言葉で言えば、1つのBlockインスタンス(DataFrameによって保持され、中間オブジェクトには必ずしも該当しない)は、常に単一のDataFrame/Seriesオブジェクトにのみ一意に使用されるべきです。たとえば、別のオブジェクトに同じBlockを使用したい場合、block.copy(deep=False)でBlockインスタンスのシャローコピーを作成できます(これにより、同じ基になる値を持つ新しいBlockインスタンスが作成され、参照が正しく設定されます)。
値に書き込む前に、参照追跡オブジェクトに、私たちとデータを共有する別のブロックがアクティブかどうかを尋ねることができます。実際に別のブロックがアクティブな場合は、書き込む前にコピーをトリガーできます。