1

現在、python.org の python チュートリアルを読んでいます。私は 10.9 を使用しており、zlib ライブラリを使用して文字列を圧縮しようとしています。ただし、len(compressedString)常に より小さいとは限りませんlen(originalString)。私の通訳コードは以下の通りです:

>>> import zlib
>>> s = 'the quick brown fox jumps over the lazy dog'
>>> len(s)
43
>>> t = zlib.compress(s)
>>> len(t)
50
>>> t
'x\x9c+\xc9HU(,\xcdL\xceVH*\xca/\xcfSH\xcb\xafP\xc8*\xcd-(V\xc8/K-R(\x01J\xe7$VU*\xa4\xe4\xa7\x03\x00a<\x0f\xfa'
>>> len(zlib.decompress(t))
43
>>> s2 = "something else i'm compressing"
>>> len(s2)
30
>>> t2 = zlib.compress(s2)
>>> len(t2)
37
>>> s3 = "witch which has which witches wrist watch"
>>> len(s3)
41
>>> t3 = zlib.compress(s3)
>>> len(t3)
37

なぜこれが起こっているのか誰にも分かりますか?

4

2 に答える 2

11

zlib 圧縮アルゴリズムは常に効率的であるとは限りません。

>>> len(zlib.compress('ab'))
10

圧縮しようとしたデータよりも多くのデータになる可能性があるメタデータ (ヘッダー、シンボル テーブル、後方参照) を追加する必要があるためです。より長く、それほどランダムではないデータで使用すると、問題なく圧縮されます。

>>> lorem = 'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit'
>>> len(lorem) * 100
9100
>>> len(zlib.compress(lorem * 100))
123
于 2013-02-26T21:42:19.030 に答える
2

ただし、len(compressedString) が常に len(originalString) より小さいとは限りません。

もちろん、それは不可能でしょう。少なくとも、元の文字列を常にロスレスで取得できると期待している場合。

ただし、deflate アルゴリズムは、zlib ヘッダーとトレーラー用に 6 バイトを加えたわずかな割合を超えて拡張することはありません。zlib ヘッダーはそれを zlib ストリームとして識別し、トレーラーはデータの整合性チェックを提供します。

于 2013-02-27T04:53:28.160 に答える