2010-03-15 8 views
7

Estoy escribiendo una implementación huffman en Python como un ejercicio de aprendizaje. Llegué al punto de escribir mis códigos huffman de longitud variable en un búfer (o archivo). ¡Solo para descubrir que no parece haber una clase bitstream implementada por Python! He echado un vistazo a los módulos array y struct, pero no parecen hacer lo que necesito sin trabajo adicional.Implementaciones Bitstream Bitstream

Un poco de goggling apareció this implementación de flujo de bits, que es más como lo que quiero. ¿Realmente no hay una clase de bitstream comparable en la biblioteca estándar de Python?

Respuesta

9

Tiene razón en que no hay nada en la biblioteca estándar, pero ¿ha probado el módulo bitstring? Está diseñado para este tipo de aplicación, es estable y well documented, por lo que creo que debería adaptarse a sus necesidades.

La construcción, la lectura, el corte, etc. se realizan en modo bit, y es puro Python. He visto ejemplos de codificación de Huffman con bastante éxito en el pasado.

Otra buena opción es bitarray, que no tiene tantas funciones pero puede ser considerablemente más rápida ya que es una extensión C. Como beneficio adicional, tiene un ejemplo de codificación de Huffman distribuido como parte del paquete fuente.

+0

'bitstring' es muy lento, pero funciona. –

+0

@Judge: Es cierto que bitstring no es tan rápido como podría ser con las extensiones C, pero creo que es bastante razonable para Python puro (al menos las últimas versiones lo son). Si tiene un buen ejemplo en el que fue realmente lento para usted, entonces el autor (que soy yo, por cierto) le encantaría verlo. Siempre es útil tener casos de uso del mundo real para ver dónde se está gastando el tiempo. –

+0

Lo siento, ese no fue el comentario más constructivo. Necesitaba escribir un guión rápido para extraer una gran secuencia de trillizos enteros de 12 bits. Bitstring cumplió muy bien ese propósito (es decir, el script de Python fue muy rápido y fácil de escribir), pero el resultado final es lento. Se reescribirá en otro idioma y se integrará en una aplicación con el tiempo. Entonces, estoy contento con el resultado de usar bitstring para el prototipo. –

1

Correcto. La mayoría de los módulos en el stdlib que necesitan un flujo de bits están escritos en C, con los detalles ocultos.

1

No, por lo que sé, no hay nada en la biblioteca estándar que lo ayude con operaciones alineadas con bits. Python no está diseñado para jugar con las cosas pequeñas ... ^^

Pero usted podría fácilmente escribir su propio flujo de bits-escritor con la ayuda de matrices de bytes:

>>> from array import array 
>>> a = array("B") 
>>> a.append(1) # 128 
>>> a.append(0) 
>>> a.append(0) 
>>> a.append(0) 
>>> a.append(1) # 8 
>>> a.append(1) # 4 
>>> a.append(1) # 2 
>>> a.append(1) # 1 
>>> print reduce(lambda m, n: (m << 1) + n, a, 0) 
143 

Usted consigue la idea ...

Cuestiones relacionadas