Saltar al contenido

Python – Comprimir cadena ASCII

Esta reseña fue aprobado por nuestros expertos para que tengas la seguridad de la veracidad de este enunciado.

Solución:

El uso de la compresión no siempre reducirá la longitud de un string!

Considere el siguiente código;

import zlib
import bz2

def comptest(s):
    print 'original length:', len(s)
    print 'zlib compressed length:', len(zlib.compress(s))
    print 'bz2 compressed length:', len(bz2.compress(s))

Intentemos esto en un vacío string;

In [15]: comptest('')
original length: 0
zlib compressed length: 8
bz2 compressed length: 14

Asi que zlib produce 8 caracteres extra, y bz2 14. Los métodos de compresión generalmente colocan un ‘encabezado’ delante de los datos comprimidos para que los use el programa de descompresión. Este encabezado aumenta la longitud de la salida.

Probemos una sola palabra;

In [16]: comptest('test')
original length: 4
zlib compressed length: 12
bz2 compressed length: 40

Incluso si restara la longitud del encabezado, la compresión no ha acortado la palabra en absoluto. Eso es porque en este caso hay poco que comprimir. La mayoría de los personajes de la string ocurrir una sola vez. Ahora para una oración corta;

In [17]: comptest('This is a compression test of a short sentence.')
original length: 47
zlib compressed length: 52
bz2 compressed length: 73

Nuevamente la salida de compresión es más grande que el texto de entrada. Debido a la longitud limitada del texto, hay pocas repeticiones en él, por lo que no se comprimirá bien.

Necesita un bloque de texto bastante largo para que la compresión realmente funcione;

In [22]: rings = '''
   ....:     Three Rings for the Elven-kings under the sky, 
   ....:     Seven for the Dwarf-lords in their halls of stone, 
   ....:     Nine for Mortal Men doomed to die, 
   ....:     One for the Dark Lord on his dark throne 
   ....:     In the Land of Mordor where the Shadows lie. 
   ....:     One Ring to rule them all, One Ring to find them, 
   ....:     One Ring to bring them all and in the darkness bind them 
   ....:     In the Land of Mordor where the Shadows lie.'''

In [23]: comptest(rings)                       
original length: 410
zlib compressed length: 205
bz2 compressed length: 248

Ni siquiera necesita que sus datos sean ascii, puede alimentar zlib con cualquier cosa

>>> import zlib
>>> a='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' # + any binary data you want
>>> print zlib.compress(a)
xKL$

>>>

Lo que probablemente quiera aquí: datos comprimidos para ser ascii string? ¿Estoy aquí?
Si es así, debe saber que tiene un alfabeto muy pequeño para codificar datos comprimidos => por lo que tendría que usar más símbolos.

Por ejemplo, para codificar datos binarios en base64 (obtendrá ascii string) pero usará ~30% más de espacio para eso

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *