पायथन लिस्ट कितनी बड़ी हो सकती है?


119

पायथन में, एक सूची कितनी बड़ी हो सकती है? मुझे लगभग 12000 तत्वों की सूची चाहिए। क्या मैं अभी भी सूची के तरीके जैसे कि छँटाई, आदि को चला पाऊँगा?

जवाबों:


193

स्रोत कोड के अनुसार , एक सूची का अधिकतम आकार है PY_SSIZE_T_MAX/sizeof(PyObject*)

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

एक नियमित 32 बिट सिस्टम पर, यह (4294967295/2) / 4 या 536870912 है।

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

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


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

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

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

@ClydeTheGhost, क्या आप निर्दिष्ट कर सकते हैं कि 64-बिट सिस्टम चलाने वाले भी 536,870,912 तत्वों की तुलना में कम अधिकतम आकार के हो सकते हैं? या कि वे बहुत भिन्न हो सकते हैं, फिर भी हमेशा एक अधिकतम आकार होता है जो 536,870,912 तत्वों के बराबर या उससे बड़ा होता है?
पर

1
@ ४४-बिट सिस्टम के लिए अधिकतम ३२-बिट सिस्टम के लिए हमेशा बराबर या बड़ा होगा।
क्लाइडइजहॉस्ट

71

जैसा कि पायथन प्रलेखन कहता है :

sys.maxsize

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

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

>>> import sys
>>> print sys.maxsize
9223372036854775807

इस सवाल का जवाब कैसे देता है
ldgorman

11
@ldgorman, sys.maxsizeसवाल का जवाब है। विभिन्न आर्किटेक्चर विभिन्न मैक्सिमा का समर्थन करते हैं।
साइमन कुआंग

2
922337203685474775807 तत्व? वास्तव में? यह सबसे उत्कट उत्तर के साथ-साथ बहुत भिन्न होता है।
अक्की

13
@akki स्वीकृत उत्तर एक 32 बिट सिस्टम की बात कर रहा है। चूंकि यह 2016 है, इसलिए मैं मान लूंगा कि आप 64 बिट सिस्टम पर हैं और इसका उत्तर इसलिए सही है
ब्रायन लीच

2
यह चयनित उत्तर होना चाहिए।
लोकेश

26

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

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

मेरी मशीन पर उन लाइनों को चलाना:

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

लेकिन यकीन है कि जैसा बाकी सभी ने कहा। सरणी जितनी धीमी होगी संचालन उतना ही बड़ा होगा।


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

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

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

6

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

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

यदि आप प्रदर्शन के बारे में परवाह करते हैं, तो एक पुस्तकालय जैसे कि NumPy में देखना सार्थक हो सकता है ।


5

सूचियों के लिए प्रदर्शन विशेषताओं को इफ्तोब पर वर्णित किया गया है।

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

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

आपका सॉर्टिंग प्रश्न अधिक बारीक है, क्योंकि तुलना ऑपरेशन समय की एक अनबिके समय ले सकता है। यदि आप वास्तव में धीमी तुलना कर रहे हैं, तो इसमें लंबा समय लगेगा, हालांकि यह पायथन की सूची डेटा प्रकार का कोई दोष नहीं है ।

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


4

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


3

यह विभिन्न प्रणालियों के लिए भिन्न होता है (रैम पर निर्भर करता है)। इसका पता लगाने का सबसे आसान तरीका है

import six six.MAXSIZE 9223372036854775807 इस का अधिकतम आकार देता है listऔर dictभी, के अनुसार प्रलेखन


1
यह दस्तावेज नहीं है
बोरिस

1

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


4
आम तौर पर सच है, लेकिन उनमें से सभी नहीं - अपेंडिंग सरणी के आकार से स्वतंत्र निरंतर स्थिर समय को बनाए रखते हैं।
cdleary

0

मुझे यह x64 बिट सिस्टम पर यहाँ से मिला: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 मई 2018, 01:54:01) [MSC v.1913 64 bit (AMD64] win32 पर]

यहां छवि विवरण दर्ज करें


1
यह एक बड़ा जवाब होगा यदि आपने विवरणों पर थोड़ा विस्तार किया और दूसरों को अपनी सीमा कैसे मिल सकती है।
22

-16

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


9
-1 क्योंकि यह वास्तव में सवाल का जवाब नहीं देता है, और वास्तव में भ्रामक है क्योंकि (अन्य उत्तरों द्वारा दिखाया गया है) सूची में वास्तव में अधिकतम आकार है।
क्लाइडइगस्टहॉस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.