You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruff规则PD008解析:转NumPy数组提性能及示例改造

Ruff规则PD008(pandas-use-of-dot-at)详解

一、规则具体含义

PD008是Ruff针对Pandas性能优化的检查规则,核心结论很明确:如果追求代码执行性能,别指望用.at替代.loc来获得明显提速,反而应该把Pandas的DataFrame/Series转换成NumPy数组——这种方式带来的性能提升幅度,远超过.at和.loc之间的差异。

.at确实是Pandas里专门做单元素快速访问的方法,比.loc略快,但这种优势非常有限;而转成NumPy数组后,能避开Pandas对象自带的大量额外封装开销,性能提升效果要显著得多。

二、NumPy数组性能更快的原因

  • 底层结构更轻量化:Pandas的DataFrame/Series是基于NumPy数组构建的,但额外加了索引管理、数据类型校验、缺失值处理等功能,这些封装会带来额外计算开销。NumPy数组是纯粹的数值存储结构,没有这些附加逻辑,直接操作内存里的连续数据块。
  • 内存布局更高效:NumPy数组采用连续内存存储,CPU缓存命中率更高;而Pandas对象因为附带索引等信息,内存布局相对零散,缓存利用效率低。
  • 操作开销更低:NumPy的核心操作都是底层C语言实现,没有Pandas方法里的索引对齐、类型兼容等额外步骤,执行路径更短。

三、针对students_df选取"Maria"的示例改造

原代码(使用.at)

import pandas as pd
students_df = pd.read_csv("students.csv")
# 假设"Maria"是索引值,获取对应行数据
target_data = students_df.at["Maria"]

优化后代码(转换为NumPy数组)

先定位"Maria"的索引位置,再通过NumPy数组直接访问:

import pandas as pd
import numpy as np

students_df = pd.read_csv("students.csv")
# 将DataFrame转为NumPy数组
students_array = students_df.to_numpy()
# 获取"Maria"对应的索引位置
maria_idx = students_df.index.get_loc("Maria")
# 直接通过数组索引访问目标数据
target_data = students_array[maria_idx]

如果是要获取某一列中"Maria"对应的值(比如"score"列):

import pandas as pd
import numpy as np

students_df = pd.read_csv("students.csv")
# 将目标列转为NumPy数组
score_array = students_df["score"].to_numpy()
# 获取"Maria"的索引位置
maria_idx = students_df.index.get_loc("Maria")
# 访问对应值
maria_score = score_array[maria_idx]

内容的提问来源于stack exchange,提问作者Salvatore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:29:53