【发布时间】:2020-04-07 23:42:26
【问题描述】:
我编写了一个脚本来为我的雇主处理 CSV 文件。该处理受 CPU 限制且文件很大。例如,3+ GB 的输入会产生 6+ GB 的输出。
在我的机器上,该文本文件的转换需要将近 16 分钟(这本身有点长,但我使用的是股票 csv-module),其中大约 30 秒用于操作系统(编写输出)。
为了好玩,我添加了透明压缩功能:
if name.endswith('.gz'):
import gzip
return gzip.GzipFile(name, mode, 9, fd)
return fd
使用压缩时,运行时间会跳到一个多小时——尽管系统时间减半,因为要写的东西要少得多。
跳跃是可以理解的,但它的规模不是——如果我只是在未压缩的输出文件上运行gzip -9,它只需要大约 13 分钟。
我可以理解,gzip 可能会通过使用更大的缓冲区等来赢得一些东西——但在我的脚本中嵌入压缩应该能够从更少的数据复制中受益。然而,它比 2:1 的损失更糟糕:16 分钟转换 + 13 分钟压缩与 61 分钟一次性完成。
为什么会有这么大的差异? Python-2.x 中的 zlib/gzip 代码是否已知很慢? Python-3 在这方面是否应该更好——它在未压缩处理方面明显更差......
【问题讨论】:
-
是的,这很慢,因为
GILrealpython.com/python-gil -
你的操作系统是什么?
-
我在 FreeBSD 和 Linux 上都试过——两种操作系统上的时间差异是相当的。我不明白,GIL 与它有什么关系——我的代码中没有任何东西是多线程的,它一次处理一个文件。
-
我在 Python 3.8 上,我仍然怀疑 Python 的 gzipping 很慢......
标签: python python-3.x python-2.7 compression gzip