2013-02-26 3 views
0

В настоящее время я изучаю учебник python.org python.org. Я на 10.9, и я пытаюсь использовать библиотеку zlib для сжатия строки. Однако len (compressString) не всегда меньше, чем len (originalString). Код моего переводчика ниже:Python zlib не сжимающая строка?

>>> 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 

Кто-нибудь знает, почему это происходит?

ответ

9

Алгоритм сжатия 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 
2

Однако Len (compressedString) не всегда меньше, чем LEN (originalString).

Это было бы, конечно, невозможно. По крайней мере, если вы ожидали, что сможете без потерь извлекать исходную строку.

Алгоритм спускания никогда не будет расширяться более чем на небольшой процент плюс шесть байтов для заголовка и трейлера zlib. Заголовок zlib идентифицирует его как поток zlib, а трейлер обеспечивает проверку целостности данных.

Смежные вопросы