我有一个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之间存在实际的性能回归。