डेटा संरचनाओं पर मैंने जो भी पुस्तकें पढ़ी हैं, अब तक सी/सी ++ का उपयोग करने लगती हैं, और वे "मैनुअल" पॉइंटर नियंत्रण का भारी उपयोग करते हैं। चूंकि पाइथन उस प्रकार के मेमोरी प्रबंधन और कचरा संग्रह को छिपाता है, इसलिए इस भाषा में कुशल डेटा संरचनाओं को लागू करना भी संभव है, और क्या अंतर्निहित उपयोग करने के बजाय ऐसा करने का कोई कारण है?पायथन में डेटा स्ट्रक्चर
उत्तर
पायथन आपको कुछ शक्तिशाली, अत्यधिक अनुकूलित डेटा संरचनाएं प्रदान करता है , मानक पुस्तकालय (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 देखें)।
कुछ साधारण डेटा संरचनाओं (उदाहरण के लिए एक स्टैक) के लिए, आप अपनी नौकरी पाने के लिए केवल बिल्टिन सूची का उपयोग कर सकते हैं। अधिक जटिल संरचनाओं (उदाहरण के लिए एक ब्लूम फ़िल्टर) के साथ, आपको भाषा का समर्थन करने वाले प्राइमेटिव्स का उपयोग करके उन्हें स्वयं लागू करना होगा।
यदि आप लंबे समय तक लोगों की भीड़ से डीबग और ऑप्टिमाइज़ किए जाने के बाद से आपको अपने उद्देश्य की सेवा करते हैं तो आपको बिल्टिन का उपयोग करना चाहिए। अपने आप से खरोंच से ऐसा करने से शायद एक निम्न डेटा संरचना उत्पन्न होगी।
हालांकि, आपको ऐसा कुछ चाहिए जो आदिम के रूप में उपलब्ध न हो या यदि आदिम पर्याप्त रूप से पर्याप्त प्रदर्शन नहीं करता है, तो आपको अपना स्वयं का प्रकार लागू करना होगा।
पॉइंटर प्रबंधन आदि जैसे विवरण केवल कार्यान्वयन की बात हैं और वास्तव में भाषा की क्षमताओं को सीमित नहीं करते हैं।
सी/सी ++ डेटा संरचना पुस्तकें केवल आपको विभिन्न संरचनाओं के पीछे अंतर्निहित सिद्धांतों को सिखाने का प्रयास कर रही हैं - वे आम तौर पर आपको सलाह नहीं देते हैं कि आप वास्तव में बाहर निकलें और स्टैक्स और सूचियों की अपनी लाइब्रेरी बनाकर पहिया का पुन: आविष्कार करें।
चाहे आप पाइथन, सी ++, सी #, जावा, जो कुछ भी उपयोग कर रहे हों, आपको हमेशा पहले निर्मित डेटा संरचनाओं को देखना चाहिए। उन्हें आम तौर पर उसी सिस्टम प्राइमेटिव्स का उपयोग करके कार्यान्वित किया जाएगा जिन्हें आपको स्वयं करने का उपयोग करना होगा, लेकिन कोशिश करने और परीक्षण करने के लाभ के साथ।
केवल तभी जब प्रदान की गई डेटा संरचनाएं आपको जो चाहिए उसे पूरा करने की अनुमति न दें, और आपके लिए कोई वैकल्पिक और विश्वसनीय लाइब्रेरी उपलब्ध नहीं है, तो क्या आपको स्क्रैच से कुछ बनाने या (जो प्रदान किया गया है) को विस्तारित करना चाहिए।
कैसे पाइथन कम स्तर पर वस्तुओं को संभालता है वैसे भी बहुत अजीब नहीं है। This document इसे एक टैड को असंबद्ध करना चाहिए; यह मूल रूप से सभी पॉइंटर तर्क है जिसे आप पहले ही परिचित हैं।
पायथन में सी ++ वेक्टर जैसे कुछ को कार्यान्वित करना संभव नहीं है, क्योंकि आपके पास सी/सी ++ के तरीके से सरणी प्राइमेटिव नहीं हैं। हालांकि, इसके अलावा किसी भी जटिल को कार्यान्वित (कुशलतापूर्वक) लागू किया जा सकता है, इसमें शामिल हैं, लेकिन इस तक सीमित नहीं है: लिंक्ड सूचियां, हैश टेबल, मल्टीसेट्स, ब्लूम फ़िल्टर इत्यादि।
मैं सी ++ वेक्टर के कार्यान्वयन से परिचित नहीं हूं लेकिन पाइथन सूची प्रकार * है * एक लिंक के बजाय एक सरणी (http://bytes.com/topic/python/answers/101848-list-implementation) के रूप में लागू किया गया है सूची। क्या वह मूल रूप से एक वेक्टर नहीं है? –
हां, एक पायथन एक सरणी के रूप में लागू किया गया है (एक सी ++ वेक्टर के समान)। मैं जो कह रहा हूं वह है कि आप मौजूदा सूची के शीर्ष पर छोड़कर * पाइथन में अपनी सूची * लागू नहीं कर सके। –
खैर, पायथन सूची प्रकार वास्तव में जावा की ऐरेलिस्ट (यानी ऑब्जेक्ट के पॉइंटर्स की एक सरणी) की तरह है। –
पायथन के साथ आपके पास अन्य लोगों द्वारा लिखित और डिबग किए गए लाइब्रेरी मॉड्यूल के विशाल वर्गीकरण तक पहुंच है। बाधाएं बहुत अच्छी हैं कि कहीं बाहर, एक मॉड्यूल है जो कम से कम आप जो चाहते हैं उसका हिस्सा करता है, और बाधाएं भी अच्छी होती हैं कि इसे प्रदर्शन में सी में लागू किया जा सकता है।
उदाहरण के लिए, यदि आपको मैट्रिक्स गणित करने की आवश्यकता है, तो आप NumPy का उपयोग कर सकते हैं, जो सी और फोरट्रान में लिखा गया था।
पायथन इतना धीमा है कि यदि आप मूल पायथन में कुछ प्रकार के वास्तव में गणना-गहन कोड (उदाहरण, फास्ट फूरियर ट्रांसफॉर्म) लिखने का प्रयास करते हैं तो आप खुश नहीं होंगे। दूसरी तरफ, आप SciPy के हिस्से के रूप में सी-कोडेड फूरियर ट्रांसफॉर्म प्राप्त कर सकते हैं, और इसका उपयोग कर सकते हैं।
मुझे ऐसी स्थिति नहीं मिली है जहां मैं पायथन में एक समस्या हल करना चाहता था और कहा, "डर्न, मैं केवल डेटा संरचना को व्यक्त नहीं कर सकता हूं।"
यदि आप अग्रणी हैं, और आप पाइथन में कुछ कर रहे हैं जिसके लिए वहां कोई लाइब्रेरी मॉड्यूल नहीं है, तो आप इसे शुद्ध पायथन में लिखने का प्रयास कर सकते हैं। यदि यह पर्याप्त तेज़ है, तो आप कर चुके हैं। यदि यह बहुत धीमा है, तो आप इसे प्रोफाइल कर सकते हैं, धीमे हिस्सों को कहां देख सकते हैं, और पाइथन सी एपीआई का उपयोग करके उन्हें सी में फिर से लिख सकते हैं। मुझे अभी तक ऐसा करने की आवश्यकता नहीं है।
- 1. क्लोजर डेटा स्ट्रक्चर सीरियलाइजेशन
- 2. एक्सेस स्ट्रक्चर डेटा (मैटलैब)
- 3. php में डेटा प्रकार स्ट्रक्चर करता है?
- 4. बेस्ट और सरल डेटा स्ट्रक्चर
- 5. कॉम्पैक्ट डेटा स्ट्रक्चर जैसे सेट
- 6. जेनेरिक डेटा स्ट्रक्चर विवरण भाषा
- 7. सी ++ एसटीएल डेटा स्ट्रक्चर संरेखण, एल्गोरिदम वेक्टरराइजेशन
- 8. स्ट्रक्चर
- 9. स्ट्रक्चर/क्लास
- 10. सी स्ट्रक्चर में एरे
- 11. जावास्क्रिप्ट में स्ट्रक्चर
- 12. सी ++ में 'स्ट्रक्चर' और 'टाइपपीफ स्ट्रक्चर' के बीच अंतर?
- 13. स्ट्रक्चर के लिए एनएसडीटा को स्ट्रक्चर?
- 14. स्ट्रक्चर मैप
- 15. स्ट्रक्चर इंजेक्शन
- 16. स्ट्रक्चर मैप
- 17. स्ट्रक्चर टाइपपीफ
- 18. स्ट्रक्चर मैप
- 19. स्ट्रक्चर epoll_event
- 20. कक्षा वीएस रेफ स्ट्रक्चर
- 21. पायथन के स्ट्रक्चर मॉड्यूल के लिए उपयुक्त बफर क्या है
- 22. लाखों नोड्स (सोशल नेटवर्क) के साथ ग्राफ डेटा स्ट्रक्चर
- 23. फास्ट लुकअप और ऑर्डर लूपिंग के लिए जावास्क्रिप्ट डेटा स्ट्रक्चर?
- 24. अनुशंसित ओपन सोर्स सी # एल्गोरिदम और डेटा स्ट्रक्चर लाइब्रेरी
- 25. सी में स्ट्रक्चर सीरियलाइजेशन और एमपीआई
- 26. पायथन: जटिल डेटा वेयरहाउस
- 27. ओपनसीवी पायथन छवि डेटा
- 28. पायथन पोस्ट बाइनरी डेटा
- 29. जेएनए स्ट्रक्चर और पॉइंटर मैपिंग
- 30. सी स्ट्रक्चर सिंटैक्स प्रश्न
अधिकांश सी/सी ++ संरचनाएं "भारी [ily] मैन्युअल पॉइंटर्स का उपयोग करें" क्योंकि उन्हें ऐसा करना अधिक प्रभावी है क्योंकि उन्हें ऐसा करना अधिक प्रभावी है। – notnoop