2

正規表現を使用して BZ2 圧縮ログファイルを解析する Python スクリプトがあります。

最初は正規表現だと思っていたパフォーマンスがかなり低下していましたが、さらに調べてみると、bz2file のパフォーマンスが低下しているようです。

Python 2.6 と bz2file 0.9 を使用しています。

Bz2file (http://pypi.python.org/pypi/bz2file) を使用してファイルを順次読み取ると、組み込みの bz2 実装を使用する場合よりも大幅に遅くなることに気付きました。

2 つのテスト スクリプトを作成しました。1 つは bz2 を使用しています。

import bz2
filename = 'some_bz2file.bz2'

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

もう1つは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が示唆するようにキャッシュをフラッシュします(ルートとして、実行ごとに別のターミナルでこれを行いました):

[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