読者です 読者をやめる 読者になる 読者になる

LZOとSnappyの圧縮効率・処理速度を比較する

Zynga Python

LZOSnappyは共に、圧縮効率は他に劣るものの、処理速度が早いことを売りにした圧縮ライブラリ。

インストール

Pythonで使うならば、LZOに関しては python-lzo-static を使うの楽なのだろうか?

$ hg clone https://bitbucket.org/james_taylor/python-lzo-static
$ cd python-lzo-static
$ pythnon setup.py install

SnappyPyPIに登録されているので、もしSnappyがインストールされているならば*1

$ pip install python-snappy

で行ける。

検証

検証には青空文庫の芥川龍之介『トロッコ』のテキスト(10263byte)を使った。

検証スクリプト。

# -*- coding: utf-8 -*- 
import timeit
import zlib
import bz2
import lzo
import snappy

content = open('torokko.txt').read()
print 'original content length', len(content)
                                                                                                                        
for lib in (zlib, bz2, lzo, snappy):
    timer = timeit.Timer('lib.compress(content)', 'from __main__ import lib, content')
    result = timer.timeit(number=1000)

    compressed = lib.compress(content)
    print lib.__name__, result, len(compressed), ('%0.4f' % (len(compressed) / float(len(content))))

結果。

original content length 10263
zlib 0.546717882156 5270 0.5135
bz2 4.33483314514 4857 0.4733
lzo 0.130795001984 6950 0.6772
snappy 0.0607089996338 7133 0.6950

すなわち、

圧縮ライブラリ 処理時間 圧縮率
zlib 0.546717882156 0.5135
bz2 4.33483314514 0.4733
lzo 0.130795001984 0.6772
snappy 0.0607089996338 0.6950

のようになった。

timeitの使い方ってこれでいいんだっけ?という感じで自信がないのだが、もし上記計測結果が正しいならば、

  • 圧縮効率はbz2, zlib, lzo, snappyの順番で良いが、bz2とzlibの間の差、lzoとsnappyの間の差は微差。bz2, zlibのグループとlzo,snappyのグループの間の差は有意な差がある。
  • 圧縮速度はsnappy, lzo, zlib, bz2の順番で良く、それぞれの間に有意な差がある。

と言ってよいのではないだろうか。

次の課題

LZOとSnappyの処理速度の差は圧倒的に見えるが、LZOの存在意義って何だろうかを考える。こことかにLZO圧縮を使うMemcacheクライアントライブラリとかがあるが、こいつの存在意義って何だろうか考える。

*1:例えばdebianの場合は、sudo apt-get install libsnappy-dev