2009-05-12 14 views
88

पायथन में, एक सरणी/सूची कितनी बड़ी हो सकती है? मुझे लगभग 12000 तत्वों की एक सरणी चाहिए। क्या मैं अभी भी सरणी/सूची विधियों जैसे सॉर्टिंग आदि चलाने में सक्षम हूं?पाइथन ऐरे कितना बड़ा हो सकता है?

+9

पायथन में सरणी और सूचियों के बीच एक बड़ा अंतर है। – recursive

उत्तर

149

source code के अनुसार, सूची का अधिकतम आकार PY_SSIZE_T_MAX/sizeof(PyObject*) है।

PY_SSIZE_T_MAXpyport.h में परिभाषित किया गया है ((size_t) -1)>>1

एक नियमित रूप से 32bit प्रणाली पर हो सकता है, यह (4294967295/2)/4 या 536870912.

इसलिए एक 32 बिट पर एक अजगर सूची का अधिकतम आकार है प्रणाली 536,870,912 तत्व है।

जब तक आपके पास मौजूद तत्वों की संख्या बराबर या उससे कम है, तो सभी सूची कार्यों को सही तरीके से कार्य करना चाहिए।

+2

'sizeof (PyObject *) == 4 क्यों है?'? यह क्या दर्शाता है? – Matt

+3

@ मैट, एकल 'पायओब्जेक्ट *' के बाइट्स की संख्या है। यह बात एक तथाकथित सूचक है (आप उन्हें अंत में क्षुद्रग्रह की वजह से पहचानते हैं)। पॉइंटर्स 4 बाइट लंबा होते हैं और आवंटित ऑब्जेक्ट में मेमोरी एड्रेस स्टोर करते हैं। वे "केवल" 4 बाइट लंबे हैं क्योंकि 4 बाइट्स के साथ आप आजकल कंप्यूटर की याद में हर तत्व को संबोधित कर सकते हैं। –

+0

यह ध्यान देने योग्य है (जैसा कि अलवारो जस्टेन का उत्तर इंगित करता है) कि अन्य मशीनों पर, विशेष रूप से 64-बिट सिस्टम चलाने वाले, 'PY_SSIZE_T_MAX' का मान बहुत अधिक हो सकता है। –

4

12000 तत्व पायथन में कुछ भी नहीं है ... और असल में तत्वों की संख्या आपके सिस्टम पर पाइथन दुभाषिया की याददाश्त तक जा सकती है।

1

मैं कहूंगा कि आप केवल कुल रैम उपलब्ध हैं। जाहिर है कि सरणी जितनी बड़ी होगी, उस पर लंबे समय तक संचालन होगा।

+3

आम तौर पर सच है, लेकिन उनमें से सभी नहीं - संलग्नक सरणी के आकार से स्वतंत्र निरंतर समय बनी हुई है। – cdleary

+0

दिलचस्प, टिप्पणी के लिए धन्यवाद। –

24

निश्चित रूप से यह ठीक है। वास्तव में आप आसानी से अपने आप के लिए देख सकते हैं:

l = range(12000) 
l = sorted(l, reverse=True) 

मेरी मशीन पर उन पंक्तियों के चल रहा है ले लिया:

real 0m0.036s 
user 0m0.024s 
sys 0m0.004s 

लेकिन सभी के रूप में यकीन है कि किसी और ने कहा। जितना बड़ा सरणी ऑपरेशन धीमा होगा।

+15

इस तरह का समय भ्रामक हो सकता है - अधिकांश समय पाइथन दुभाषिया शुरू करने में व्यतीत होता है। एक बेहतर तरीका यह है: पायथन -एम timeit.py "एल = रेंज (12000); एल = क्रमबद्ध (एल, रिवर्स = ट्रू)"। मेरी मशीन पर यह इस उदाहरण के लिए लगभग 1/20 वें समय देता है। –

+3

@ डीएफ, आप सटीकता के बारे में सही हैं। उस पर ध्यान देने के लिए धन्यवाद। मैं बस एक बिंदु साबित करना चाहता था। और उदाहरण यह साबित करता है। –

+8

@ डीएफ: बहुत बढ़िया! 0.024s मेरे लिए बहुत लंबा था और मुझे खुशी है कि मैं इसके बारे में चिंता करना बंद कर सकता हूं। –

6

आकस्मिक कोड में मैंने लाखों तत्वों के साथ सूचियां बनाई हैं। मेरा मानना ​​है कि पाइथन का सूचियों का कार्यान्वयन केवल आपके सिस्टम पर स्मृति की मात्रा से बंधे हैं।

इसके अतिरिक्त, सूची विधियों/कार्यों को सूची के आकार के बावजूद काम करना जारी रखना चाहिए।

यदि आप प्रदर्शन की परवाह करते हैं, तो NumPy जैसी लाइब्रेरी को देखना उचित हो सकता है।

5

Performance characteristics for lists Effbot पर वर्णित हैं।

पायथन सूची वास्तव में तेज़ यादृच्छिक पहुंच के लिए वेक्टर के रूप में लागू की जाती है, इसलिए कंटेनर मूल रूप से स्मृति में स्थान के रूप में कई वस्तुओं को पकड़ लेगा। (आपको सूची में निहित पॉइंटर्स के साथ-साथ ऑब्जेक्ट (ओं) की ओर इशारा करने के लिए स्मृति में स्थान की आवश्यकता है।)

O(1) (अमूर्त निरंतर जटिलता) संलग्न है, हालांकि, बीच के मध्य में डालने/हटाने अनुक्रम को O(n) (रैखिक जटिलता) रीडरिंग की आवश्यकता होगी, जो आपकी सूची में तत्वों की संख्या के रूप में धीमी हो जाएगी।

आपका सॉर्टिंग प्रश्न अधिक प्रचलित है, क्योंकि तुलना ऑपरेशन एक असीमित समय ले सकता है। यदि आप वास्तव में धीमी तुलना कर रहे हैं, तो इसमें काफी समय लगेगा, हालांकि Python's list data type की कोई गलती नहीं है।

रिवर्सल सूची में सभी पॉइंटर्स को स्वैप करने के लिए आवश्यक समय लेता है (आवश्यक O(n) (रैखिक जटिलता), क्योंकि आप प्रत्येक पॉइंटर को एक बार स्पर्श करते हैं)।

31

रूप Python documentation says:

sys.maxsize

सबसे बड़ा सकारात्मक पूर्णांक मंच के Py_ssize_t प्रकार द्वारा समर्थित, और इस तरह अधिकतम आकार सूची, तार, dicts, और कई अन्य कंटेनरों कर सकते हैं की है।

अपने कंप्यूटर में (लिनक्स x86_64):

>>> import sys 
>>> print sys.maxsize 
9223372036854775807 
+0

यह प्रश्न – ldgorman

+3

@ ldgorman का उत्तर कैसे देता है, 'sys.maxsize' प्रश्न का उत्तर है। विभिन्न वास्तुकला विभिन्न maxima का समर्थन करते हैं। –

+0

क्या sys.maxsize द्वारा दिया गया मान कंप्यूटर में उपलब्ध रैम की मात्रा को किसी भी तरह से दर्शाता है? – GeoJohn

-8

वहाँ सूची संख्या की कोई सीमा नहीं है। आपकी वजह से मुख्य कारण रैम है। कृपया अपनी मेमोरी आकार को अपग्रेड करें।

+1

-1 सही है क्योंकि यह वास्तव में प्रश्न का उत्तर नहीं देता है, और वास्तव में भ्रामक है क्योंकि (जैसा कि अन्य उत्तरों द्वारा दिखाया गया है) सूची में वास्तव में एक है अधिकतम आकार। –

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