2

我有一个使用正则表达式解析 BZ2 压缩日志文件的 Python 脚本。

我们的表现非常糟糕,我最初认为这是我的正则表达式 - 但是,当我进一步观察时,似乎 bz2file 表现不佳。

我们使用的是 Python 2.6 和 bz2file 0.9。

我注意到使用 Bz2file (http://pypi.python.org/pypi/bz2file) 顺序读取文件似乎比使用内置 bz2 实现慢得多。

我写了两个测试脚本 - 一个使用 bz2:

import bz2
filename = 'some_bz2file.bz2'

if __name__ == "__main__":
    f = bz2.BZ2File(filename, 'rb')
    for line in f:
        print(line)

另一个使用 bz2file:

import bz2file
filename = 'some_bz2file.bz2'

if __name__ == "__main__":
    f = bz2file.BZ2File(filename, 'rb')
    for line in f:
        print(line)

我给他们两个计时:

$ time python26 testbz.py  > /dev/null

real    0m0.608s
user    0m0.596s
sys     0m0.011s

$ time python26 testbz2file.py > /dev/null

real    0m12.035s
user    0m11.952s
sys     0m0.075s

为了比较, bzcat 在同一个文件上:

$ time bzcat some_bz2file.bz2 > /dev/null

real    0m0.503s
user    0m0.499s
sys     0m0.004s

我的理解是 bz2file 只是关于 bz2 的一个包装器,但添加了对多流 BZ2 文件(我们确实使用)的处理。

bz2file 可能比 bz2 慢得多,还有其他原因吗?(或者我上面的分析有缺陷吗?)如果是这样,有什么方法可以加快 bz2file 的速度吗?

干杯,维克多

编辑 - 我做了一些更多的测试,包括在 Python 3.3 上 - 显然 bz2file 是 Python 3.3 的 bz2 模块的反向移植 - 并且还按照 jordanm 的建议刷新缓存(我在每次运行之间的单独终端中以 root 身份执行此操作):

[vichoo@dev_desktop_vm Desktop]$ time /opt/python3.3/bin/python3.3 testbz2.py > /dev/null

real    0m5.170s
user    0m5.009s
sys     0m0.030s
[vichoo@dev_desktop_vm Desktop]$ time /opt/python3.3/bin/python3.3 testbz2file.py > /dev/null

real    0m5.245s
user    0m4.979s
sys     0m0.060s
[vichoo@dev_desktop_vm Desktop]$ time /opt/python2.7/bin/python2.7 testbz2.py > /dev/null

real    0m0.500s
user    0m0.410s
sys     0m0.030s
[vichoo@dev_desktop_vm Desktop]$ time /opt/python2.7/bin/python2.7 testbz2file.py > /dev/null

real    0m5.801s
user    0m5.529s
sys     0m0.050s

这里似乎确实有一些有趣的东西,不确定这是我的方法,还是 Python 2.x 的 bz2 和 Python 3.x 的 bz2 之间存在实际的性能回归。

4

0 回答 0