【问题标题】:Load CSV then return list of rows加载 CSV 然后返回行列表
【发布时间】:2020-05-20 09:40:13
【问题描述】:

我有以下工作代码,它读取一个包含两列约 500 行的 csv 文件,然后返回两列的列表列表并将值转换为浮点数。

我在每个测试用例中读取大约 200k 个文件,因此总共大约 500 万个 .csv 文件。读取 200k 并返回列表大约需要 1.5 分钟。

我做了一个只读取 .csvs 的基准测试,大约需要 5 秒,所以瓶颈在于列表理解 + 浮点转换。

可以加快速度吗?我已经尝试过 pandas、numpy loadtxt 和 genfromtxt。与目前的相比,我尝试过的所有替代方案都非常缓慢。

.csv 文件内容示例:

1.000e-08, -1.432e-07
1.001e-08, 7.992e-07
1.003e-08, -1.838e-05
# continues for more 500 lines

一些基准测试:

读取 200k 500 行 2 列的 .csv 文件,如上例:

使用 Pandas:6m9s (369s)

def read_csv_return_list_of_rows(csv_file, _delimiter):
    df=pd.read_csv(csv_file, sep=_delimiter,header=None)
    return df.astype('float').values

使用 NumPy 的 genfromtxt:3m58s (238s)

def read_csv_return_list_of_rows(csv_file, _delimiter):
    return np.genfromtxt(csv_file, delimiter=_delimiter)

使用标准库中的 CSV.reader:1m31s (91s)

def read_csv_return_list_of_rows(csv_file, _delimiter):
    with open(csv_file, 'r') as f_read:
        csv_reader = csv.reader(f_read, delimiter = _delimiter)
        csv_file_list = [[float(i) for i in row] for row in csv_reader]
    return csv_file_list

如果我从最后一个实现中删除 float() 时间会显着减少,如果我删除列表理解,那么这两个就是这里的问题。

来自答案:

@SpghttCd:1 分 27 秒(87 秒)

【问题讨论】:

  • 只是一个小注释,你不需要启动一个空列表,列表理解已经为你创建了列表。
  • 是的,我实际上忘记删除了。谢谢。
  • 现在,我的问题是,熊猫使用.astype('float').values 是否比嵌套列表理解慢?更不用说 numpy 应该比 pandas 快。
  • @Celius 你能写一个答案吗?我使用df=pd.read_csv(csv_file, sep=_delimiter,header=None) 然后df.values 来获取列表。你的意思是使用df.astype('float').values?如果是这种情况,我刚刚尝试过,需要 6 分 9 秒才能完成。
  • @Celius 我用一些基准更新了这个问题。

标签: python python-3.x pandas numpy csv


【解决方案1】:

无法测试,所以只是一个建议我会如何尝试:

def read_csv_return_list_of_rows_gen(csv_file, _delimiter):
    with open(csv_file, 'r') as f_read:
        for line in f_read:
            yield [float(i) for i in line.split(_delimiter)]

result = list(read_csv_return_list_of_rows_gen(filename, ','))

【讨论】:

  • 谢谢。我测试了您的解决方案,它需要 1m27s 与 1m31s(我的解决方案)来读取和计算 200k .csv 文件,其中包含 500 行和 2 列。我认为在这种情况下我不会从yield 中获利,因为我在等待result 被填充后再使用它。
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多