【发布时间】:2016-07-01 20:29:00
【问题描述】:
我制作了一个 python 脚本来分析日志。我有一个观察要分享,还有两个问题要问。
当我使用 gzip.open 打开每个文件并浏览每一行时,浏览所有行和文件大约需要 200 秒。
with gzip.open(file) as fp:
for line in fp:
pass
如果使用zcat 和grep 来完成这项工作,大约需要 50 秒。
temp = commands.getstatusoutput("zcat file* | grep pattern")
性能差异太大,不容忽视。有没有更好的方法来缩小差距?
我还注意到commands 模块已被subprocess 模块淘汰,这似乎总是创建一个临时文件。但这不方便,如果无法从运行 python 脚本的位置创建临时文件怎么办?有什么建议吗?
【问题讨论】:
-
我怀疑差异仅在于迭代。你对循环中的每一行做了什么?
-
请记住,
grep使用了一些极其完善的代码生成技术来优化其速度。它可能很旧,但这并不意味着它很糟糕——在这种情况下,恰恰相反。你可能会花费数十年的时间来尝试跟上它的速度,但不能接近,因为制造它的人非常非常聪明。 (例如,见lists.freebsd.org/pipermail/freebsd-current/2010-August/…) -
如果上面显示的 Python 'for' 循环确实是空的,并且速度差异是由于 zcat 和 Python 的 gzip 之间的差异造成的:您可以尝试一个实验。如果您手动解压缩文件,然后将 Python 的 'gzip.open' 替换为常规的 'open',会发生什么情况。这可能会揭示导致放缓的原因。
-
我已经修改了我的帖子。我最初试图找到一些模式。后来,为了进行基准测试,我戴上了“通过”来衡量时间。
-
@Jonathan Hartley 我喜欢你关于消除 gzip.open 和 zcat 影响的建议。我解压缩了 .log.gz 文件并比较了速度。结果是使用python遍历每一行需要36秒,而使用grep需要6.5秒。