正規表現を使用して 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 の間に実際のパフォーマンスの低下があるのかはわかりません。