Python处理百万级CSV数据集:代码运行效率优化求助
优化CSV数据处理效率的方案
核心思路:抛弃逐行for循环,改用批量/矢量化处理
Python原生for循环在百万级数据场景下开销极高,换成专门的数据分析工具或批量处理逻辑,能把运行时间从十几分钟压缩到几秒级别。
方案1:用pandas直接读取处理(最推荐)
pandas底层基于C实现,矢量化操作效率远超纯Python循环,142万行数据的读取+解析通常几秒就能完成。
示例代码:
import pandas as pd # 直接读取分号分隔的CSV,指定列名、数据类型并自动解析时间 df = pd.read_csv( '你的数据文件.csv', sep=';', names=['time_UTC', 'vmag2D', 'vdir'], dtype={'vmag2D': float, 'vdir': int}, parse_dates=['time_UTC'] ) # 后续处理直接基于DataFrame操作,比如筛选、计算 # 示例:筛选vmag2D大于0.5的记录 filtered_data = df[df['vmag2D'] > 0.5]
如果需要自定义处理逻辑,优先用numpy矢量化函数替代df.apply(),进一步提升效率。
方案2:用内置csv模块批量读取
若不想引入第三方库,用标准库csv模块配合批量读取+转换,也能大幅提速:
import csv from datetime import datetime processed_data = [] # 开启大缓冲读取,减少磁盘IO次数 with open('你的数据文件.csv', 'r', buffering=1024*1024) as f: reader = csv.reader(f, delimiter=';') # 批量读取,每次处理1000行 while True: batch_rows = list(reader)[:1000] if not batch_rows: break # 批量转换数据格式 batch_processed = [ (datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S'), float(row[1]), int(row[2])) for row in batch_rows ] processed_data.extend(batch_processed)
方案3:用numpy直接加载(适合数值计算场景)
如果时间列可转换为时间戳数值,numpy的加载速度会更快:
import numpy as np from datetime import datetime # 自定义转换器:将时间字符串转为时间戳 def str_to_timestamp(s): return datetime.strptime(s.decode('utf-8'), '%Y-%m-%d %H:%M:%S').timestamp() # 加载数据并指定格式 data = np.loadtxt( '你的数据文件.csv', delimiter=';', converters={0: str_to_timestamp, 1: float, 2: int}, dtype=np.dtype([('time_UTC', np.float64), ('vmag2D', np.float64), ('vdir', np.int32)]) )
额外优化点
- 避免在循环内做IO操作,比如逐行写入文件,改成批量写入。
- M1 Mac环境下,安装针对ARM架构优化的库(比如通过conda-forge或Homebrew安装pandas/numpy),能进一步释放性能。
- 不需要保留全量数据时,边读边过滤,减少内存占用同时提升速度。
内容的提问来源于stack exchange,提问作者João Roquette Saldanha
相关产品推荐
相关产品推荐

