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
相关产品推荐
相关产品推荐

