写时复制#

写时复制 (Copy on Write) 是一种机制,用于简化索引 API 并通过尽可能避免复制来提高性能。CoW 意味着任何从另一个 DataFrame 或 Series 以任何方式派生的对象,其行为总是如同一个副本。有关如何高效使用写时复制 (Copy on Write) 的解释可以在此处找到。

引用跟踪#

为了能够确定在写入 DataFrame 时是否需要进行复制,我们必须了解这些值是否与另一个 DataFrame 共享。pandas 内部跟踪所有与其他块共享值的 Blocks,以便能够判断何时需要触发复制。引用跟踪机制在 Block 级别实现。

我们使用自定义的引用跟踪对象 BlockValuesRefs,它跟踪所有值彼此共享内存的块。该引用通过弱引用保持。每对共享内存的块应指向同一个 BlockValuesRefs 对象。如果一个块超出作用域,则对该块的引用就失效了。因此,引用跟踪对象总是知道有多少块处于活动状态并共享内存。

每当 DataFrameSeries 对象与另一个对象共享数据时,要求这些对象各自拥有自己的 BlockManager 和 Block 对象。因此,换句话说,一个 Block 实例(由 DataFrame 持有,不一定用于中间对象)应始终唯一地用于单个 DataFrame/Series 对象。例如,当您想将同一个 Block 用于另一个对象时,您可以使用 block.copy(deep=False) 创建 Block 实例的浅层复制(这将创建一个具有相同底层值的新 Block 实例,并正确设置引用)。

在写入值之前,我们可以询问引用跟踪对象是否存在其他与其共享数据的活动块。如果确实存在另一个活动块,我们可以在写入前触发复制。