से []
तेज क्यों है list()
?
सबसे बड़ा कारण यह है कि पायथन list()
सिर्फ एक उपयोगकर्ता-परिभाषित फ़ंक्शन की तरह व्यवहार करता है , जिसका अर्थ है कि आप इसे किसी अन्य list
चीज़ से अलग करके और कुछ अलग करने के लिए इसे रोक सकते हैं (जैसे कि अपनी स्वयं की उपवर्ग सूची या शायद एक छल का उपयोग करें)।
यह तुरंत एक अंतर्निहित सूची का एक नया उदाहरण बनाता है []
।
मेरी व्याख्या आपको इसके लिए अंतर्ज्ञान देना चाहती है।
व्याख्या
[]
आमतौर पर शाब्दिक वाक्य रचना के रूप में जाना जाता है।
व्याकरण में, इसे "सूची प्रदर्शन" के रूप में संदर्भित किया जाता है। डॉक्स से :
एक सूची प्रदर्शन वर्ग कोष्ठक में संलग्न भावों की संभवतः एक खाली श्रृंखला है:
list_display ::= "[" [starred_list | comprehension] "]"
एक सूची प्रदर्शन एक नई सूची ऑब्जेक्ट, अभिव्यक्ति की एक सूची या एक समझ द्वारा निर्दिष्ट की जा रही सामग्री देता है। जब अभिव्यक्तियों की अल्पविराम से अलग की गई सूची की आपूर्ति की जाती है, तो उसके तत्वों का मूल्यांकन बाएं से दाएं किया जाता है और उस क्रम में सूची ऑब्जेक्ट में रखा जाता है। जब एक समझ की आपूर्ति की जाती है, तो सूची का निर्माण उन तत्वों से किया जाता है जो समझ से उत्पन्न होते हैं।
संक्षेप में, इसका मतलब है कि प्रकार की एक निर्मित वस्तु list
बनाई गई है।
इसको दरकिनार नहीं किया जाता है - जिसका अर्थ है कि पायथन इसे जल्दी से जल्दी कर सकता है।
दूसरी ओर, बिलिन सूची के निर्माणकर्ता का उपयोग करके list()
एक बेसिन बनाने से रोक दिया जा सकता है list
।
उदाहरण के लिए, मान लें कि हम चाहते हैं कि हमारी सूचियाँ उत्तरोत्तर बनाई जाएं:
class List(list):
def __init__(self, iterable=None):
if iterable is None:
super().__init__()
else:
super().__init__(iterable)
print('List initialized.')
हम तब list
मॉड्यूल स्तर के वैश्विक दायरे पर नाम को रोक सकते हैं , और फिर जब हम एक बनाते हैं list
, तो हम वास्तव में हमारी उप-सूचीबद्ध सूची बनाते हैं:
>>> list = List
>>> a_list = list()
List initialized.
>>> type(a_list)
<class '__main__.List'>
इसी तरह हम इसे वैश्विक नाम स्थान से हटा सकते हैं
del list
और इसे बिलियन नेमस्पेस में रखा:
import builtins
builtins.list = List
और अब:
>>> list_0 = list()
List initialized.
>>> type(list_0)
<class '__main__.List'>
और ध्यान दें कि सूची प्रदर्शन बिना शर्त के एक सूची बनाता है:
>>> list_1 = []
>>> type(list_1)
<class 'list'>
हम शायद केवल अस्थायी रूप से ऐसा करते हैं, इसलिए हमारे परिवर्तनों को पूर्ववत करें - पहले List
बिलिंस से नई वस्तु हटा दें :
>>> del builtins.list
>>> builtins.list
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'builtins' has no attribute 'list'
>>> list()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'list' is not defined
ओह, नहीं, हमने मूल का ट्रैक खो दिया है।
चिंता न करें, हम अभी भी प्राप्त कर सकते हैं list
- यह सूची शाब्दिक का प्रकार है:
>>> builtins.list = type([])
>>> list()
[]
इसलिए...
से []
तेज क्यों है list()
?
जैसा कि हमने देखा है - हम अधिलेखित कर सकते हैं list
- लेकिन हम शाब्दिक प्रकार के निर्माण को रोक नहीं सकते हैं। जब हम उपयोग list
करते हैं तो हमें यह देखने के लिए कि क्या कुछ है, देखने के लिए क्या करना है।
फिर हमें जो भी कॉल करने योग्य है, उसे देखना होगा। व्याकरण से:
एक कॉल एक कॉल करने योग्य वस्तु (उदाहरण के लिए, एक फ़ंक्शन) में संभवतः तर्कों की खाली श्रृंखला होती है:
call ::= primary "(" [argument_list [","] | comprehension] ")"
हम देख सकते हैं कि यह किसी भी नाम के लिए समान है, न कि केवल सूची:
>>> import dis
>>> dis.dis('list()')
1 0 LOAD_NAME 0 (list)
2 CALL_FUNCTION 0
4 RETURN_VALUE
>>> dis.dis('doesnotexist()')
1 0 LOAD_NAME 0 (doesnotexist)
2 CALL_FUNCTION 0
4 RETURN_VALUE
के लिए []
वहाँ अजगर बाईटकोड स्तर पर कोई समारोह कॉल है:
>>> dis.dis('[]')
1 0 BUILD_LIST 0
2 RETURN_VALUE
यह बस सीधे किसी भी लुकअप या कॉल के बिना सूची का निर्माण करने के लिए जाता है।
निष्कर्ष
हमने प्रदर्शित किया है कि list
स्कूपिंग नियमों का उपयोग करके उपयोगकर्ता कोड के साथ अवरोधन किया जा सकता है, और वहlist()
एक कॉल करने योग्य लगता है और फिर इसे कॉल करता है।
जबकि []
एक सूची प्रदर्शन, या एक शाब्दिक है, और इस प्रकार नाम देखने और फ़ंक्शन कॉल से बचा जाता है।
()
और''
विशेष हैं, क्योंकि वे न केवल खाली हैं, वे अपरिवर्तनीय हैं, और जैसे, यह उन्हें एकल बनाने के लिए एक आसान जीत है; वे नई वस्तुओं का निर्माण भी नहीं करते हैं, सिर्फ खालीtuple
/ के लिए सिंगलटन लोड करते हैंstr
। तकनीकी रूप से एक कार्यान्वयन विवरण, लेकिन मेरे पास यह कल्पना करने का कठिन समय है कि वे प्रदर्शन कारणों से खाली / कैश क्यों नहीं करेंगे । तो एक शेयर शाब्दिक के बारे में और वापस पारित करने का आपका अंतर्ज्ञान गलत था, लेकिन यह लागू होता है और ।tuple
str
[]
{}
()
''