写入时复制#

写入时复制是一种简化索引 API 并通过尽可能避免复制来提高性能的机制。 CoW 意味着任何以任何方式从另一个派生的 DataFrame 或 Series 始终表现为副本。有关如何有效使用写入时复制的说明可以在此处找到。

参考跟踪#

为了能够确定在写入 DataFrame 时是否必须制作副本,我们必须知道这些值是否与另一个 DataFrame 共享。 pandas 在内部跟踪所有Blocks与另一个块共享值的内容,以便能够判断何时需要触发副本。参考跟踪机制是在块级别实现的。

我们使用自定义引用跟踪器对象,BlockValuesRefs它跟踪每个块,其值彼此共享内存。该引用是通过弱引用保存的。每对共享一些内存的块应该指向同一个BlockValuesRefs对象。如果一个块超出范围,对该块的引用就会消失。因此,引用跟踪器对象始终知道有多少块处于活动状态并共享内存。

每当一个DataFrame或多个Series对象与另一个对象共享数据时,就要求每个对象都有自己的 BlockManager 和 Block 对象。因此,换句话说,一个 Block 实例(由 DataFrame 持有,不一定用于中间对象)应该始终唯一地仅用于单个 DataFrame/Series 对象。例如,当您想要对另一个对象使用相同的 Block 时,您可以创建 Block 实例的浅表副本block.copy(deep=False)(这将创建一个具有相同基础值的新 Block 实例,并且将正确设置引用)。

在写入值之前,我们可以询问引用跟踪对象是否有另一个活动块与我们共享数据。如果实际上还有另一个块处于活动状态,我们可以在写入之前触发副本。