Python bz2file比bz2慢吗?

时间:2012-09-25 03:46:31

标签: python performance bzip2

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

我们的表现相当糟糕,我最初认为这是我的正则表达式 - 然而,当我进一步观察时,似乎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之间存在实际的性能回归。

0 个答案:

没有答案