Python Bitstream реализации - PullRequest
       30

Python Bitstream реализации

7 голосов
/ 15 марта 2010

Я пишу реализацию Хаффмана на Python в качестве учебного упражнения. Я дошел до того, что записал свои коды Хаффмана переменной длины в буфер (или файл). Похоже, только для того, чтобы найти там, не существует класса битового потока, реализованного Python! Я посмотрел на модули array и struct , но они, кажется, не выполняют то, что мне нужно, без дополнительной работы.

Немного ошарашено оказалось эта реализация битового потока, которая больше похожа на то, что я хочу. Действительно ли в стандартной библиотеке Python нет сопоставимого класса потока битов?

Ответы [ 4 ]

9 голосов
/ 16 марта 2010

Вы правы, что в стандартной библиотеке ничего нет, но вы пробовали модуль bitstring ? Она в значительной степени разработана для такого рода приложений, стабильна и хорошо документирована , поэтому я думаю, что она должна соответствовать вашим потребностям.

Построение, чтение, нарезка и т. Д. Все выполняются по битам, и это чистый Python. Я видел примеры кодирования Хаффмана, с которыми он успешно справлялся в прошлом.

Другим хорошим вариантом является bitarray , который не имеет столько функций, но может быть значительно быстрее, чем расширение C. В качестве бонуса он имеет пример кодирования Хаффмана, распространяемый как часть исходного пакета.

1 голос
/ 29 мая 2015

Я, возможно, немного опаздываю на вечеринку, но есть библиотека битового потока:

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

1 голос
/ 15 марта 2010

Нет, насколько я знаю, в стандартной библиотеке нет ничего, что помогло бы вам с выравниванием битов. Python не предназначен для мелочей ^^ ...

Но вы можете легко написать свой собственный обработчик битового потока с помощью байтовых массивов:

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

Вы поняли ...

1 голос
/ 15 марта 2010

Правильно. Большинство модулей в stdlib, которые нуждаются в потоке битов, написаны на C, а детали скрыты.

...