12 Stimmen

Python-Bitstream-Implementierungen

Ich schreibe eine huffman Implementierung in Python als Lernübung. Ich bin an dem Punkt angelangt, meine Huffman-Codes mit variabler Länge in einen Puffer (oder eine Datei) zu schreiben. Nur um festzustellen, dass es keine Bitstream-Klasse zu geben scheint, die von Python implementiert wird! Ich habe einen Blick auf die Array y Struktur Module, aber sie scheinen nicht zu tun, was ich brauche, ohne zusätzliche Arbeit.

Nach einigem Stöbern fand man ce Bitstream-Implementierung, die eher dem entspricht, was ich mir wünsche. Gibt es wirklich keine vergleichbare Bitstream-Klasse in der Python-Standardbibliothek?

16voto

Scott Griffiths Punkte 20629

Sie haben Recht, dass es nichts in der Standardbibliothek gibt, aber haben Sie versucht, die Bitstring Modul? Es ist ziemlich genau für diese Art von Anwendung konzipiert, ist stabil und gut dokumentiert Ich denke also, dass es Ihren Bedürfnissen entsprechen sollte.

Aufbau, Lesen, Zerlegen usw. werden alle bitweise durchgeführt, und es ist reines Python. Ich habe in der Vergangenheit Beispiele für die Huffman-Kodierung gesehen, die damit recht erfolgreich waren.

Eine weitere gute Option ist Bitarray das zwar nicht so viele Funktionen hat, aber wesentlich schneller sein kann, da es eine C-Erweiterung ist. Als Bonus gibt es ein Beispiel für die Huffman-Kodierung, das als Teil des Quellpakets verteilt wird.

2voto

Joel B Punkte 697

Ich bin vielleicht ein bisschen spät dran, aber es gibt diese Bitstream-Bibliothek:

https://pypi.python.org/pypi/bitstream/2.0.3

1voto

Richtig. Die meisten der Module in der stdlib, die Bitstreaming benötigen, sind in C geschrieben, wobei die Details versteckt sind.

1voto

AndiDog Punkte 65445

Nein, soweit ich weiß, gibt es nichts in der Standardbibliothek, die Sie mit Bit-ausgerichteten Operationen hilft. Python ist nicht dafür gedacht, sich mit dem Kleinkram herumzuschlagen ^^...

Mit Hilfe von Byte-Arrays kann man aber leicht einen eigenen Bitstream-Writer schreiben:

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

Sie können sich das vorstellen...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X