Pandas 写时复制实现指南

Beginner

This tutorial is from open-source community. Access the source code

简介

本实验提供了一份循序渐进的指南,用于理解和实现 Python Pandas 中的写时复制(Copy-On-Write,CoW)概念。CoW 是一种优化策略,通过尽可能延迟复制来提高性能和内存使用率。它还有助于避免意外修改多个对象。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会立即为你解决问题。

启用写时复制

首先,让我们在 pandas 中启用 CoW。这可以通过使用 pandas 中的copy_on_write配置选项来完成。以下是两种可以全局启用 CoW 的方法。

## 导入 pandas 和 numpy 库
import pandas as pd

## 使用 set_option 启用 CoW
pd.set_option("mode.copy_on_write", True)

## 或者直接赋值
pd.options.mode.copy_on_write = True

理解使用 DataFrame 的写时复制

现在,让我们创建一个 DataFrame,看看写时复制如何影响数据修改。

## 创建一个 DataFrame
df = pd.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]})

## 创建 DataFrame 的一个子集
subset = df["foo"]

## 修改子集
subset.iloc[0] = 100

## 打印原始 DataFrame
print(df)

使用 DataFrame 实现写时复制

现在,让我们看看在修改 DataFrame 时如何实现写时复制。

## 启用写时复制
pd.options.mode.copy_on_write = True

## 创建 DataFrame 的一个子集
subset = df["foo"]

## 修改子集
subset.iloc[0] = 100

## 打印原始 DataFrame
print(df)

理解写时复制下的链式赋值

现在,让我们来理解链式赋值在写时复制中的工作方式。

## 创建一个 DataFrame
df = pd.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]})

## 应用链式赋值,这将违反写时复制原则
df["foo"][df["bar"] > 5] = 100

## 打印 DataFrame
print(df)

使用写时复制实现链式赋值

最后,让我们看看如何使用loc方法在写时复制的情况下实现链式赋值。

## 创建一个 DataFrame
df = pd.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]})

## 使用'loc'在写时复制的情况下应用链式赋值
df.loc[df["bar"] > 5, "foo"] = 100

## 打印 DataFrame
print(df)

总结

在本实验中,你学习了写时复制(Copy-On-Write,简称 CoW)的概念以及如何在 Python 的 Pandas 中实现它。你还理解了 CoW 如何影响数据修改以及它在链式赋值中的工作方式。通过使用 CoW,你可以优化代码以获得更好的性能和内存使用效率。