我有一个使用正则表达式解析 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 之间存在实际的性能回归。