2010-03-15 2 views
7

Sto scrivendo un'implementazione huffman in Python come esercizio di apprendimento. Sono arrivato al punto di scrivere i miei codici huffman di lunghezza variabile su un buffer (o file). Solo per trovare lì non sembra essere una classe bitstream implementata da Python! Ho dato un'occhiata ai moduli e struct ma non sembrano fare ciò di cui ho bisogno senza lavoro extra.Implementazioni Bitstream Python

Un po 'di goggling attivato this implementazione bitstream, che è più simile a quello che sto volendo. Non esiste realmente una classe bitstream comparabile nella libreria standard Python?

risposta

9

Hai ragione che non c'è niente nella libreria standard, ma hai provato il modulo bitstring? È praticamente progettato per questo tipo di applicazione, è stabile e well documented, quindi penso che dovrebbe soddisfare le vostre esigenze.

La costruzione, la lettura, l'affettamento, ecc. Sono tutti eseguiti a bit, ed è puro Python. Ho visto esempi di codifica di Huffman portati a termine con successo in passato.

Un'altra buona opzione è bitarray, che non ha tante funzioni ma può essere considerevolmente più veloce in quanto è un'estensione C. Come bonus ha un esempio di codifica Huffman distribuito come parte del pacchetto sorgente.

+0

'stringa di bit' è molto lento, ma funziona. –

+0

@Judge: È vero che il bitstring non è veloce come potrebbe essere con le estensioni C, ma penso che sia abbastanza ragionevole per Python puro (almeno le ultime versioni lo sono). Se hai un buon esempio in cui è stato davvero lento per te, allora l'autore (che sono io tra l'altro) mi piacerebbe vederlo. È sempre utile avere casi d'uso reali per vedere dove viene speso il tempo. –

+0

Mi dispiace, non è stato il commento più costruttivo. Avevo bisogno di scrivere uno script veloce per estrarre una grande sequenza di terzine di interi a 12 bit. il bitstring ha funzionato proprio bene (lo script python era molto veloce e facile da scrivere), ma il risultato finale è lento. Sarà riscritto in un'altra lingua e incorporato in un'applicazione alla fine. Quindi, sono contento del risultato dell'utilizzo della sequenza di bit per il prototipo. –

1

Corretto. La maggior parte dei moduli nello stdlib che richiedono il bitstreaming sono scritti in C, con i dettagli nascosti.

1

No, per quanto ne so, non c'è niente nella libreria standard che ti aiuti con le operazioni allineate con i bit. Python non è progettato per giocherellare con le piccole cose ^^ ...

Ma si potrebbe facilmente scrivere il proprio flusso di bit-scrittore con l'aiuto di array di byte:

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

Si ottiene l'idea ...