2009-12-31 15 views
12

डेटा संरचनाओं पर मैंने जो भी पुस्तकें पढ़ी हैं, अब तक सी/सी ++ का उपयोग करने लगती हैं, और वे "मैनुअल" पॉइंटर नियंत्रण का भारी उपयोग करते हैं। चूंकि पाइथन उस प्रकार के मेमोरी प्रबंधन और कचरा संग्रह को छिपाता है, इसलिए इस भाषा में कुशल डेटा संरचनाओं को लागू करना भी संभव है, और क्या अंतर्निहित उपयोग करने के बजाय ऐसा करने का कोई कारण है?पायथन में डेटा स्ट्रक्चर

+7

अधिकांश सी/सी ++ संरचनाएं "भारी [ily] मैन्युअल पॉइंटर्स का उपयोग करें" क्योंकि उन्हें ऐसा करना अधिक प्रभावी है क्योंकि उन्हें ऐसा करना अधिक प्रभावी है। – notnoop

उत्तर

20

पायथन आपको कुछ शक्तिशाली, अत्यधिक अनुकूलित डेटा संरचनाएं प्रदान करता है , मानक पुस्तकालय (list एस और dict एस, एस, set एस, array एस मॉड्यूल array में मॉड्यूल collections में कुछ अन्य कंटेनर के रूप में, दोनों अंतर्निहित और कुछ मॉड्यूल के रूप में निर्मित हैं।

इन डेटा संरचनाओं के संयोजन (और हो सकता है कि heapq और bisect) जैसे सहायक मॉड्यूल से कुछ फ़ंक्शन आम तौर पर वास्तविक जीवन प्रोग्रामिंग में आवश्यक अधिकांश समृद्ध संरचनाओं को लागू करने के लिए पर्याप्त हैं; हालांकि, यह हमेशा मामला नहीं है।

जब आपको समृद्ध लाइब्रेरी प्रदान करता है तो कुछ और चाहिए, इस तथ्य पर विचार करें कि किसी ऑब्जेक्ट के गुण (और संग्रह में आइटम) अनिवार्य रूप से अन्य ऑब्जेक्ट्स (पॉइंटर अंकगणितीय के बिना) "पॉइंटर्स" हैं, यानी "शोधनीय संदर्भ", में पाइथन बस जावा में पसंद है।पायथन में, आप आमतौर पर NULL का प्रतिनिधित्व करने के लिए एक विशेषता या आइटम में None मान का उपयोग करते हैं, जिसका अर्थ है सी ++ या null जावा में होगा।

तो, उदाहरण के लिए, आप के माध्यम से, उदाहरण के लिए द्विआधारी पेड़ को लागू कर सकते हैं:

class Node(object): 

    __slots__ = 'payload', 'left', 'right' 

    def __init__(self, payload=None, left=None, right=None): 
    self.payload = payload 
    self.left = left 
    self.right = right 

प्लस तरीकों या ट्रेवर्सल के लिए कार्य करता है और इसी तरह के आपरेशनों (__slots__ वर्ग विशेषता वैकल्पिक है - ज्यादातर एक स्मृति अनुकूलन, से बचने के लिए प्रत्येक Node उदाहरण अपने __dict__ लेता है, जो तीन आवश्यक विशेषताओं/संदर्भों से काफी बड़ा होगा)।

डेटा संरचनाओं के अन्य उदाहरण है कि सबसे अच्छा नहीं बल्कि अन्य मौजूदा अजगर संरचनाओं के प्रत्यक्ष संरचना द्वारा की तुलना में समर्पित अजगर वर्गों द्वारा प्रतिनिधित्व किया जा सकता है, शामिल tries (जैसे देखने here) और graphs (जैसे here देखें)।

14

कुछ साधारण डेटा संरचनाओं (उदाहरण के लिए एक स्टैक) के लिए, आप अपनी नौकरी पाने के लिए केवल बिल्टिन सूची का उपयोग कर सकते हैं। अधिक जटिल संरचनाओं (उदाहरण के लिए एक ब्लूम फ़िल्टर) के साथ, आपको भाषा का समर्थन करने वाले प्राइमेटिव्स का उपयोग करके उन्हें स्वयं लागू करना होगा।

यदि आप लंबे समय तक लोगों की भीड़ से डीबग और ऑप्टिमाइज़ किए जाने के बाद से आपको अपने उद्देश्य की सेवा करते हैं तो आपको बिल्टिन का उपयोग करना चाहिए। अपने आप से खरोंच से ऐसा करने से शायद एक निम्न डेटा संरचना उत्पन्न होगी।

हालांकि, आपको ऐसा कुछ चाहिए जो आदिम के रूप में उपलब्ध न हो या यदि आदिम पर्याप्त रूप से पर्याप्त प्रदर्शन नहीं करता है, तो आपको अपना स्वयं का प्रकार लागू करना होगा।

पॉइंटर प्रबंधन आदि जैसे विवरण केवल कार्यान्वयन की बात हैं और वास्तव में भाषा की क्षमताओं को सीमित नहीं करते हैं।

9

सी/सी ++ डेटा संरचना पुस्तकें केवल आपको विभिन्न संरचनाओं के पीछे अंतर्निहित सिद्धांतों को सिखाने का प्रयास कर रही हैं - वे आम तौर पर आपको सलाह नहीं देते हैं कि आप वास्तव में बाहर निकलें और स्टैक्स और सूचियों की अपनी लाइब्रेरी बनाकर पहिया का पुन: आविष्कार करें।

चाहे आप पाइथन, सी ++, सी #, जावा, जो कुछ भी उपयोग कर रहे हों, आपको हमेशा पहले निर्मित डेटा संरचनाओं को देखना चाहिए। उन्हें आम तौर पर उसी सिस्टम प्राइमेटिव्स का उपयोग करके कार्यान्वित किया जाएगा जिन्हें आपको स्वयं करने का उपयोग करना होगा, लेकिन कोशिश करने और परीक्षण करने के लाभ के साथ।

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

3

कैसे पाइथन कम स्तर पर वस्तुओं को संभालता है वैसे भी बहुत अजीब नहीं है। This document इसे एक टैड को असंबद्ध करना चाहिए; यह मूल रूप से सभी पॉइंटर तर्क है जिसे आप पहले ही परिचित हैं।

0

पायथन में सी ++ वेक्टर जैसे कुछ को कार्यान्वित करना संभव नहीं है, क्योंकि आपके पास सी/सी ++ के तरीके से सरणी प्राइमेटिव नहीं हैं। हालांकि, इसके अलावा किसी भी जटिल को कार्यान्वित (कुशलतापूर्वक) लागू किया जा सकता है, इसमें शामिल हैं, लेकिन इस तक सीमित नहीं है: लिंक्ड सूचियां, हैश टेबल, मल्टीसेट्स, ब्लूम फ़िल्टर इत्यादि।

+1

मैं सी ++ वेक्टर के कार्यान्वयन से परिचित नहीं हूं लेकिन पाइथन सूची प्रकार * है * एक लिंक के बजाय एक सरणी (http://bytes.com/topic/python/answers/101848-list-implementation) के रूप में लागू किया गया है सूची। क्या वह मूल रूप से एक वेक्टर नहीं है? –

+0

हां, एक पायथन एक सरणी के रूप में लागू किया गया है (एक सी ++ वेक्टर के समान)। मैं जो कह रहा हूं वह है कि आप मौजूदा सूची के शीर्ष पर छोड़कर * पाइथन में अपनी सूची * लागू नहीं कर सके। –

+0

खैर, पायथन सूची प्रकार वास्तव में जावा की ऐरेलिस्ट (यानी ऑब्जेक्ट के पॉइंटर्स की एक सरणी) की तरह है। –

2

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

उदाहरण के लिए, यदि आपको मैट्रिक्स गणित करने की आवश्यकता है, तो आप NumPy का उपयोग कर सकते हैं, जो सी और फोरट्रान में लिखा गया था।

पायथन इतना धीमा है कि यदि आप मूल पायथन में कुछ प्रकार के वास्तव में गणना-गहन कोड (उदाहरण, फास्ट फूरियर ट्रांसफॉर्म) लिखने का प्रयास करते हैं तो आप खुश नहीं होंगे। दूसरी तरफ, आप SciPy के हिस्से के रूप में सी-कोडेड फूरियर ट्रांसफॉर्म प्राप्त कर सकते हैं, और इसका उपयोग कर सकते हैं।

मुझे ऐसी स्थिति नहीं मिली है जहां मैं पायथन में एक समस्या हल करना चाहता था और कहा, "डर्न, मैं केवल डेटा संरचना को व्यक्त नहीं कर सकता हूं।"

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

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