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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:45:30