Python zlib не сжимает строку?

Сейчас я прохожу учебник по python.org. У меня 10.9, и я пытаюсь использовать библиотеку zlib для сжатия строки. Тем не менее, len(compressString) не всегда меньше, чем 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

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

2 ответа

Решение

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

Тем не менее, len(compressString) не всегда меньше, чем len(originalString).

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

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

Другие вопросы по тегам