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

Pandas读取列数可变文本文件时skiprows增大耗时增加的优化问询

处理可变列宽空格分隔文本的性能优化

我需要处理一个包含175132行、列数可变的空格分隔中型文本文件,目标是读取文件的不同部分并转换为数组,用于后续数据处理。

初始方案及性能问题

最初我使用自定义函数循环调用pd.read_csv,通过skiprows指定跳过行数来读取单行数据,代码如下:

def read_table_block_to_row(file, skip, nvals, ncols):
    Row_values=np.zeros((1,nvals))
    for row in range(int(np.ceil(nvals/ncols))):
        st = time.time()
        skiprows=skip+row
        row_arr=pd.read_csv(file,sep='\s+', skiprows=skiprows, nrows=1, header=None).to_numpy()
        for col in range(ncols):
            idx=row*ncols+col
            Row_values[0,idx]=row_arr[0,col]
    return (Row_values)

测试后发现严重的性能问题:skiprows的值越大,单行读取的耗时显著增加。具体测试数据如下:

  • skiprows=941时,耗时约0.0057秒
  • skiprows=37421时,耗时约0.021秒
  • skiprows=73901时,耗时约0.038秒
  • skiprows=110381时,耗时约0.048秒

这种情况下,整体读取数据的耗时长达30-45分钟,我曾尝试查找相关解决方案但未能解决问题,因此寻求更快的块读取方案(包括非Pandas方案)。

优化方案及效果

最终我找到一种高效的优化方案:跳过文件前2行后,文件拥有足够的列宽可以直接读取全部数据,再通过自定义函数将DataFrame转换为所需格式。优化后,整体耗时从45分钟-1小时缩短至11秒。

代码实现如下:

# 跳过前2行后,文件包含了最大列数,因此可以直接读取全部数据
data = pd.read_csv(file, skiprows=2, header=None, sep='\s+')

# 自定义函数读取并转换数据格式
def read_row(df,start,end):
    row_data = data.iloc[start:end,:].unstack().to_frame().dropna().droplevel(level=1).reset_index(drop=True).T
    return row_data

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:24:31