स्पष्ट रूप से list(a)
समग्र नहीं है, [x for x in a]
कुछ बिंदुओं पर समग्र, और हर समय[*a]
समग्र ?
यहाँ 0 से 12 तक के आकार और तीन तरीकों के लिए बाइट्स में परिणामी आकार दिए गए हैं:
0 56 56 56
1 64 88 88
2 72 88 96
3 80 88 104
4 88 88 112
5 96 120 120
6 104 120 128
7 112 120 136
8 120 120 152
9 128 184 184
10 136 184 192
11 144 184 200
12 152 184 208
इस तरह की गणना की गई, जो कि प्रतिकृति पर पुन: प्रयोज्य है । पायथन 3. 8 का उपयोग करके :
from sys import getsizeof
for n in range(13):
a = [None] * n
print(n, getsizeof(list(a)),
getsizeof([x for x in a]),
getsizeof([*a]))
यह कैसे काम करता है? [*a]
समग्र कैसे करता है ? दरअसल, दिए गए इनपुट से परिणाम सूची बनाने के लिए किस तंत्र का उपयोग किया जाता है? क्या यह एक पुनरावृत्ति का उपयोग करता है a
और कुछ का उपयोग करता है list.append
? सोर्स कोड कहां है?
( डेटा और कोड के साथ कोलाब जो छवियों का उत्पादन करते हैं।)
छोटे n में ज़ूमिंग:
बड़ा n करने के लिए बाहर ज़ूमिंग:
list(a)
पूरी तरह से सी में काम करता है; यह आंतरिक बफर नोड को नोड द्वारा आवंटित कर सकता है क्योंकि यह इससे अधिक पुनरावृत्ति करता है a
। [x for x in a]
बस LIST_APPEND
एक बहुत का उपयोग करता है, इसलिए यह सामान्य "एक सामान्य सूची के आवश्यक" पैटर्न को थोड़ा, फिर से व्यवस्थित करता है। [*a]
का उपयोग करता है BUILD_LIST_UNPACK
, जो ... मुझे नहीं पता कि वह क्या करता है, इसके अलावा अन्य सभी समय से अधिक आवंटित करते हैं :)
list(a)
और [*a]
समान हैं, और दोनों समग्र रूप से तुलना करते हैं [x for x in a]
, इसलिए ... sys.getsizeof
यहां उपयोग करने के लिए सही उपकरण नहीं हो सकता है।
sys.getsizeof
है कि सही उपकरण है, यह सिर्फ दिखाता है कि list(a)
समग्र रूप से उपयोग किया जाता है। वास्तव में व्हाट्स न्यू इन पाइथन 3.8 का उल्लेख है: "सूची निर्माणकर्ता समग्र [...] नहीं करता है" ।
[*a]
देती है , जबकिextend
एक खाली सूची का उपयोग करते हुए व्यवहार करता प्रतीत होता है ।