एक सादे पायथन सूची में उत्पन्न करने के लिए इस्तेमाल किया IPython कोड है, हर डबल परिशुद्धता संख्या स्मृति के कम से कम 32 बाइट्स की आवश्यकता है, लेकिन केवल 8 बाइट्स वास्तविक स्टोर करने के लिए उपयोग किया जाता है संख्या, बाकी पाइथन की गतिशील प्रकृति का समर्थन करने के लिए आवश्यक है।
नाव CPython में इस्तेमाल वस्तु floatobject.h में परिभाषित किया गया है:
typedef struct {
PyObject_HEAD
double ob_fval;
} PyFloatObject;
जहां PyObject_HEAD
PyObject
struct को a macro that expands है:
typedef struct _object {
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;
इसलिए, अजगर दुकानों में हर चल बिन्दु वस्तु दो pointer- आकार के फ़ील्ड (इसलिए प्रत्येक 64-बिट आर्किटेक्चर पर 8 बाइट्स लेता है) 8-बाइट डबल के अलावा, प्रति संख्या 24 बाइट ढेर आवंटित स्मृति प्रदान करता है। यह sys.getsizeof(1.0) == 24
द्वारा पुष्टि की गई है।
इसका मतलब है कि अजगर में n
युगल की एक सूची बस संख्या वस्तुओं के लिए संकेत (PyObject*
) स्टोर करने के लिए स्मृति के कम से कम 8*n
बाइट्स लेता है, और प्रत्येक संख्या वस्तु अतिरिक्त 24 बाइट्स की आवश्यकता है। यह परीक्षण करने के लिए, अजगर आरईपीएल में निम्नलिखित लाइनों चलाने की कोशिश:
>>> import math
>>> list_of_doubles = [math.sin(x) for x in range(10*1000*1000)]
और अजगर दुभाषिया की मैमोरी उपयोग देखने (मैं अपने x86-64 कंप्यूटर पर आबंटित स्मृति की लगभग 350 एमबी मिल गया)। ,
>>> list_of_doubles = [1.0 for __ in range(10*1000*1000)]
तुम सिर्फ लगभग 80 एमबी प्राप्त होगा क्योंकि सूची के सभी तत्वों ही चल बिन्दु संख्या 1.0
का उदाहरण देखें: ध्यान दें कि यदि आप की कोशिश की।
स्रोत
2016-07-28 12:04:24
अधिक रैम! अन्य चीजों के साथ सूची ओवरहेड है। यदि आप चिंतित हैं, ए) पता लगाएं, और बी) केवल मेमोरी में कच्चे डेटा को संग्रहीत करने और इसे फ्लाई पर अनपॅक करने पर विचार करें (यह इस बात पर निर्भर करता है कि आप इसके साथ क्या कर रहे हैं)। – Ryan
संबंधित: http: // stackoverflow।कॉम/ए/994010/846892 –
मेरा पहला विचार यह है कि उपयोगकर्ता को तब तक इंतजार करना पड़ेगा जब तक कि वह डेटा रैम में लोड नहीं हो जाता। –