Pergunta

Estou escrevendo um Huffman Implementação em Python como exercício de aprendizado. Cheguei ao ponto de escrever meus códigos de huffman de comprimento variável em um buffer (ou arquivo). Apenas descobrir que não parece haver uma classe BitStream implementada pelo Python! Eu dei uma olhada no variedade e estrutura Módulos, mas eles não parecem fazer o que eu preciso sem trabalho extra.

Um pouco de folga apareceu isto A implementação do BitStream, que é mais como o que estou querendo. Realmente não existe a classe BitStream comparável na biblioteca padrão do Python?

Foi útil?

Solução

Você está certo de que não há nada na biblioteca padrão, mas você já tentou o bitstring módulo? É praticamente projetado para esse tipo de aplicação, é estável e bem documentado, então acho que deve atender às suas necessidades.

Construção, leitura, fatia, etc. são todos feitos bit e é puro python. Eu já vi exemplos de codificação de Huffman feitos com sucesso no passado.

Outra boa opção é bitArray, que não tem tantos recursos, mas pode ser consideravelmente mais rápido, pois é uma extensão C. Como bônus, ele tem um exemplo de codificação de Huffman distribuído como parte do pacote de origem.

Outras dicas

Correto. A maioria dos módulos no stdlib que precisa de streaming de bits é escrita em C, com os detalhes escondidos.

Não, até onde eu sei, não há nada na biblioteca padrão que o ajude com operações alinhadas por bits. Python não foi projetado para mexer com as pequenas coisas ^^ ...

Mas você pode escrever facilmente seu próprio escritor de bits com a ajuda de matrizes 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

Você entendeu a ideia...

Talvez eu esteja um pouco atrasado para a festa, mas existe esta biblioteca BitStream:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top