2010-03-15 14 views
7

मैं एक सीखने के अभ्यास के रूप में पायथन में huffman कार्यान्वयन लिख रहा हूं। मुझे अपने परिवर्तनीय लंबाई हफमैन कोड को बफर (या फ़ाइल) में लिखने के बिंदु पर पहुंच गया है। केवल पाइथन द्वारा लागू बिटस्ट्रीम क्लास नहीं लगता है! मैंने array और struct मॉड्यूल पर एक नज़र डाली है लेकिन वे ऐसा नहीं करते हैं जो मुझे अतिरिक्त काम के बिना चाहिए।पायथन बिटस्ट्रीम कार्यान्वयन

कुछ गोगलिंग this बिटस्ट्रीम कार्यान्वयन को बदल दिया, जो कि मैं चाहता हूं कि अधिक है। क्या पाइथन मानक पुस्तकालय में वास्तव में कोई तुलनीय बिटस्ट्रीम कक्षा नहीं है?

उत्तर

9

आप सही हैं कि मानक पुस्तकालय में कुछ भी नहीं है, लेकिन आपने bitstring मॉड्यूल का प्रयास किया है? यह इस तरह के अनुप्रयोग के लिए काफी डिजाइन किया गया है, स्थिर है और well documented है, इसलिए मुझे लगता है कि यह आपकी आवश्यकताओं के अनुरूप होना चाहिए।

निर्माण, पढ़ना, टुकड़ा करना आदि सभी को थोड़ा सा किया गया है, और यह शुद्ध पायथन है। मैंने हफमैन कोडिंग उदाहरणों को अतीत में काफी सफलतापूर्वक देखा है।

एक और अच्छा विकल्प bitarray है, जिसमें कई सुविधाएं नहीं हैं लेकिन यह सी एक्सटेंशन के रूप में काफी तेज हो सकती है। बोनस के रूप में इसमें एक हफमैन कोडिंग उदाहरण स्रोत पैकेज के हिस्से के रूप में वितरित किया गया है।

+0

'bitstring' वास्तव में धीमी गति से है, लेकिन यह काम करता है। –

+0

@ जुज: यह सच है कि बिटकस्ट्रिंग जितना तेजी से सी एक्सटेंशन के साथ नहीं हो सकता है, लेकिन मुझे लगता है कि यह शुद्ध पायथन (कम से कम नवीनतम संस्करण हैं) के लिए काफी उचित है। यदि आपके पास एक अच्छा उदाहरण है जहां यह वास्तव में आपके लिए धीमा था तो लेखक (जो मुझे रास्ते में है) इसे देखना पसंद करेंगे। वास्तविक दुनिया के उपयोग के मामलों को यह देखने में हमेशा मददगार होता है कि समय कहां खर्च किया जा रहा है। –

+0

क्षमा करें, यह सबसे रचनात्मक टिप्पणी नहीं थी। मुझे 12-बिट पूर्णांक ट्रिपलेट्स का एक बड़ा अनुक्रम निकालने के लिए एक त्वरित स्क्रिप्ट लिखने की आवश्यकता थी। बिटस्ट्रिंग ने उस उद्देश्य को ठीक से ठीक किया (यानी पायथन लिपि बहुत तेज़ और लिखना आसान था), लेकिन अंतिम परिणाम धीमा है। यह एक और भाषा में फिर से लिखा जाएगा और अंततः एक आवेदन में एम्बेडेड होगा। इसलिए, मैं प्रोटोटाइप के लिए बिटस्ट्रिंग का उपयोग करने के परिणाम से खुश हूं। –

1

सही। Stdlib में अधिकांश मॉड्यूल जिन्हें बिटस्ट्रीमिंग की आवश्यकता होती है, सी में लिखे गए विवरणों के साथ सी में लिखे गए हैं।

1

नहीं, जहां तक ​​मुझे पता है कि मानक पुस्तकालय में कुछ भी नहीं है जो आपको थोड़ा-गठबंधन संचालन में मदद करता है। अजगर छोटे सामान ^^ साथ बेला के लिए डिज़ाइन किया गया है नहीं ...

लेकिन आप आसानी से बाइट सरणियों की मदद से अपनी खुद की बिटस्ट्रीम-लेखक लिख सकते हैं:

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

आप अंदाजा हो ...

0

मैं पार्टी के लिए देर से शायद एक छोटे से कर रहा हूँ, लेकिन इसके बिटस्ट्रीम पुस्तकालय है:

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

संबंधित मुद्दे