【发布时间】: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