如何高效将Pandas读取的CSV数据转换为Gaze对象列表?
高效将CSV数据转换为Gaze对象的方案
核心思路
避免逐行循环解析(如iterrows或csv.DictReader),改用Pandas批量提取数据+Numpy数组存储+列表推导/生成器的组合,利用Numpy的C级运算效率大幅提升处理速度。
实现代码
import pandas as pd import numpy as np class Gaze: def __init__(self, ts, frame_idx, gaze2D, gaze_dir3D=None): self.ts = ts self.frame_idx = frame_idx self.gaze2D = gaze2D self.gaze_dir3D = gaze_dir3D # 1. 读取CSV数据 df = pd.read_csv("your_gaze_data.csv") # 2. 批量提取所需列并转为Numpy数组(一次性完成,避免逐行读取) ts_arr = df["timestamp"].to_numpy() frame_idx_arr = df["frame_idx"].to_numpy() gaze2D_arr = df[["gaze_pos_x", "gaze_pos_y"]].to_numpy() gaze_dir3D_arr = df[["gaze_dir_x", "gaze_dir_y", "gaze_dir_z"]].to_numpy() # 3. 用列表推导式快速生成Gaze对象列表 gaze_objects = [ Gaze(ts_arr[i], frame_idx_arr[i], gaze2D_arr[i], gaze_dir3D_arr[i]) for i in range(len(df)) ]
内存优化方案(超大数据量场景)
如果CSV数据量极大,一次性生成所有Gaze对象会占用过多内存,可改用生成器表达式按需生成对象:
def generate_gaze_objects(df): ts_arr = df["timestamp"].to_numpy() frame_idx_arr = df["frame_idx"].to_numpy() gaze2D_arr = df[["gaze_pos_x", "gaze_pos_y"]].to_numpy() gaze_dir3D_arr = df[["gaze_dir_x", "gaze_dir_y", "gaze_dir_z"]].to_numpy() for i in range(len(df)): yield Gaze(ts_arr[i], frame_idx_arr[i], gaze2D_arr[i], gaze_dir3D_arr[i]) # 按需迭代处理,无需一次性加载所有对象 for gaze_obj in generate_gaze_objects(df): # 执行单个对象的处理逻辑 pass
性能提升原因
- 批量数据提取:Pandas读取CSV后直接转为Numpy数组,避免了
iterrows逐行生成Series的额外开销; - Numpy数组访问:Numpy数组的元素访问是C级实现,远快于Python原生字典/Series的访问速度;
- 列表推导效率:列表推导的循环效率比
for...in iterrows()或csv.DictReader的纯Python循环高数倍。
内容的提问来源于stack exchange,提问作者Diederick C. Niehorster
相关产品推荐
相关产品推荐

