Django 2.1 - Performance and optimization

प्रदर्शन और अनुकूलन




django

प्रदर्शन और अनुकूलन

यह दस्तावेज़ तकनीकों और उपकरणों का अवलोकन प्रदान करता है जो आपके Django कोड को अधिक कुशलता से चलाने में मदद कर सकते हैं - तेजी से, और कम सिस्टम संसाधनों का उपयोग करके।

परिचय

आम तौर पर किसी की पहली चिंता कोड लिखने का काम करती है , जिसके तर्क अपेक्षित उत्पादन का काम करते हैं। कभी-कभी, हालांकि, यह कोड के काम को कुशलतापूर्वक करने के लिए पर्याप्त नहीं होगा जैसा कि कोई चाहेगा।

इस मामले में, जो आवश्यक है वह कुछ है - और व्यवहार में, अक्सर चीजों का एक संग्रह - बिना कोड के प्रदर्शन को बेहतर बनाने के लिए, या केवल न्यूनतम रूप से, इसके व्यवहार को प्रभावित करता है।

सामान्य दृष्टिकोण

आप किस चीज के लिए अनुकूलन कर रहे हैं?

एक स्पष्ट विचार रखना महत्वपूर्ण है कि 'प्रदर्शन' से आपका क्या मतलब है। इसकी सिर्फ एक मीट्रिक नहीं है।

एक कार्यक्रम के लिए बेहतर गति सबसे स्पष्ट उद्देश्य हो सकता है, लेकिन कभी-कभी अन्य प्रदर्शन सुधार की मांग की जा सकती है, जैसे कि मेमोरी की कम खपत या डेटाबेस या नेटवर्क पर कम मांगें।

एक क्षेत्र में सुधार अक्सर दूसरे में बेहतर प्रदर्शन के बारे में लाएगा, लेकिन हमेशा नहीं; कभी-कभी एक दूसरे की कीमत पर भी हो सकता है। उदाहरण के लिए, प्रोग्राम की गति में सुधार के कारण यह अधिक मेमोरी का उपयोग कर सकता है। इससे भी बदतर, यह आत्म-पराजय हो सकता है - यदि गति में सुधार स्मृति-भूख है, तो सिस्टम मेमोरी से बाहर निकलना शुरू कर देता है, आपने अच्छे से अधिक नुकसान किया है।

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

इसलिए, आपको यह जानना होगा कि आप किस प्रदर्शन सुधार के लिए लक्ष्य कर रहे हैं, और आपको यह भी जानना होगा कि आपके पास उस दिशा में लक्ष्य करने के लिए एक अच्छा कारण है - और इसके लिए आपको आवश्यकता है:

प्रदर्शन बेंचमार्किंग

यह अनुमान लगाने या मानने में अच्छा नहीं है कि अक्षमताएँ आपके कोड में कहाँ निहित हैं।

Django उपकरण

django-debug-toolbar एक बहुत ही उपयोगी उपकरण है जो आपके कोड को क्या कर रहा है और इसके साथ कितना समय बिताता है, इसमें अंतर्दृष्टि प्रदान करता है। विशेष रूप से यह आपको दिखा सकता है कि आपके पृष्ठ पर सभी SQL क्वेरीज़ उत्पन्न हो रही हैं, और प्रत्येक ने कितना समय लिया है।

टूलबार के लिए तृतीय-पक्ष पैनल भी उपलब्ध हैं, उदाहरण के लिए (उदाहरण के लिए) कैश प्रदर्शन और टेम्पलेट रेंडरिंग समय पर रिपोर्ट कर सकते हैं।

तृतीय-पक्ष सेवाएँ

ऐसी कई निःशुल्क सेवाएँ हैं जो वास्तविक उपयोगकर्ता के अनुभव के प्रभाव में, दूरस्थ HTTP क्लाइंट के परिप्रेक्ष्य से आपकी साइट के पृष्ठों के प्रदर्शन का विश्लेषण और रिपोर्ट करेंगी।

ये आपके कोड के आंतरिक पर रिपोर्ट नहीं कर सकते हैं, लेकिन आपकी साइट के समग्र प्रदर्शन में एक उपयोगी जानकारी प्रदान कर सकते हैं, जिसमें उन पहलुओं को भी शामिल किया जा सकता है जिन्हें Django वातावरण के भीतर से पर्याप्त रूप से मापा नहीं जा सकता है। उदाहरणों में शामिल:

कई भुगतान-प्राप्त सेवाएं भी हैं जो एक समान विश्लेषण करती हैं, जिनमें कुछ ऐसे हैं जो Django के बारे में जानते हैं और अपने प्रदर्शन को और अधिक व्यापक रूप से प्रोफ़ाइल करने के लिए अपने कोडबेस के साथ एकीकृत कर सकते हैं।

चीजों को शुरुआत से ही सही पाएं

अनुकूलन में कुछ कामों में प्रदर्शन की कमियों से निपटना शामिल होता है, लेकिन कुछ कार्य केवल आपके द्वारा वैसे भी बनाए जा सकते हैं, जो प्रदर्शन में सुधार करने के बारे में सोचना शुरू करने से पहले आपको अपनाए जाने वाले अच्छे अभ्यासों के भाग के रूप में अपनाए जाने चाहिए।

इस संबंध में पायथन के साथ काम करने के लिए एक उत्कृष्ट भाषा है, क्योंकि समाधान जो सुरुचिपूर्ण दिखते हैं और सही महसूस करते हैं वे आमतौर पर सबसे अच्छा प्रदर्शन करने वाले होते हैं। अधिकांश कौशलों के साथ, सीखने में "सही लगता है" अभ्यास होता है, लेकिन सबसे उपयोगी दिशानिर्देशों में से एक है:

उचित स्तर पर काम करें

Django चीजों को प्राप्त करने के कई अलग-अलग तरीके प्रदान करता है, लेकिन सिर्फ इसलिए कि एक निश्चित तरीके से कुछ करना संभव नहीं है, इसका मतलब यह नहीं है कि यह करने के लिए सबसे उपयुक्त तरीका है। उदाहरण के लिए, आप पा सकते हैं कि आप एक ही चीज़ की गणना कर सकते हैं - एक संग्रह में वस्तुओं की संख्या, शायद - एक QuerySet , पायथन में, या एक टेम्पलेट में।

हालांकि, उच्च स्तर के बजाय इस काम को करने के लिए यह लगभग हमेशा तेज होगा। उच्च स्तर पर प्रणाली को कई स्तरों के माध्यम से वस्तुओं के साथ व्यवहार करना पड़ता है और मशीनरी की परतें होती हैं।

अर्थात्, डेटाबेस आमतौर पर पायथन कैन की तुलना में तेजी से चीजें कर सकता है, जो उन्हें टेम्पलेट भाषा की तुलना में तेजी से कर सकता है:

# QuerySet operation on the database
# fast, because that's what databases are good at
my_bicycles.count()

# counting Python objects
# slower, because it requires a database query anyway, and processing
# of the Python objects
len(my_bicycles)

# Django template filter
# slower still, because it will have to count them in Python anyway,
# and because of template language overheads
{{ my_bicycles|length }}

सामान्यतया, नौकरी के लिए सबसे उपयुक्त स्तर सबसे निचला स्तर है जिसे कोड करना आसान है।

ध्यान दें

ऊपर दिया गया उदाहरण केवल दृष्टांत है।

सबसे पहले, एक वास्तविक जीवन के मामले में आपको यह विचार करने की आवश्यकता है कि आपकी गणना के पहले और बाद में क्या हो रहा है, यह उस विशेष संदर्भ में करने का एक इष्टतम तरीका क्या है । डेटाबेस ऑप्टिमाइज़ेशन दस्तावेज़ एक ऐसे मामले का वर्णन करते हैं जहाँ टेम्पलेट में गिनती बेहतर होगी

दूसरे, विचार करने के लिए अन्य विकल्प हैं: वास्तविक जीवन के मामले में, {{ my_bicycles.count }} , जो टेम्पलेट से सीधे QuerySet count() विधि को आमंत्रित करता है, सबसे उपयुक्त विकल्प हो सकता है।

कैशिंग

एक मूल्य की गणना करने के लिए अक्सर यह महंगा (यानी, संसाधन-भूख ​​और धीमा) होता है, इसलिए अगली बार जब आवश्यक हो, तो जल्दी से सुलभ कैश के लिए मूल्य को बचाने में भारी लाभ हो सकता है।

यह एक पर्याप्त रूप से महत्वपूर्ण और शक्तिशाली तकनीक है कि Django में एक व्यापक कैशिंग रूपरेखा, साथ ही साथ कैशिंग कार्यक्षमता के अन्य छोटे टुकड़े शामिल हैं।

कैशिंग ढांचा

Django के कैशिंग फ्रेमवर्क गतिशील सामग्री को सहेजकर, प्रदर्शन लाभ के लिए बहुत महत्वपूर्ण अवसर प्रदान करता है, ताकि प्रत्येक अनुरोध के लिए इसकी गणना करने की आवश्यकता न हो।

सुविधा के लिए, Django कैश ग्रैन्युलैरिटी के विभिन्न स्तरों की पेशकश करता है: आप विशिष्ट दृश्यों के आउटपुट को कैश कर सकते हैं, या केवल उन टुकड़ों को उत्पन्न करना मुश्किल है, या यहां तक ​​कि एक पूरी साइट भी।

कैशिंग को लागू करने को कोड में सुधार के विकल्प के रूप में नहीं माना जाना चाहिए जो खराब प्रदर्शन कर रहा है क्योंकि यह बुरी तरह से लिखा गया है। यह एक अच्छा प्रदर्शन करने वाले कोड का निर्माण करने की दिशा में अंतिम चरणों में से एक है, शॉर्टकट नहीं।

cached_property

कक्षा आवृत्ति को एक से अधिक बार कॉल करना आम है। यदि वह फ़ंक्शन महंगा है, तो ऐसा करना बेकार हो सकता है।

cached_property डेकोरेटर का उपयोग करना एक संपत्ति द्वारा लौटाए गए मूल्य को बचाता है; अगली बार जब फ़ंक्शन उस उदाहरण पर कॉल किया जाता है, तो वह इसे पुन: कंप्यूटिंग के बजाय सहेजे गए मान को लौटा देगा। ध्यान दें कि यह केवल उन तरीकों पर काम करता है जो self को उनके एकमात्र तर्क के रूप में लेते हैं और यह विधि को संपत्ति में बदल देता है।

कुछ Django घटकों की अपनी कैशिंग कार्यक्षमता भी है; उन घटकों से संबंधित अनुभागों में नीचे चर्चा की गई है।

आलस्य को समझना

आलस्य कैशिंग के लिए एक रणनीति पूरक है। कैशिंग परिणामों को बचाकर पुन: प्रतिष्ठा से बचता है; जब तक वास्तव में इसकी आवश्यकता होती है तब तक आलस्य की गणना में देरी होती है

आलस्य हमें चीजों को संदर्भित करने की अनुमति देता है इससे पहले कि वे तात्कालिक हैं, या इससे पहले कि उन्हें तत्काल करना संभव है। इसके कई उपयोग हैं।

उदाहरण के लिए, आलसी अनुवाद का उपयोग लक्ष्य भाषा के जाने से पहले भी किया जा सकता है, क्योंकि यह तब तक नहीं होता है जब तक कि अनुवादित स्ट्रिंग वास्तव में आवश्यक नहीं होती है, जैसे कि एक रेंडर टेम्पलेट में।

आलस्य भी पहली जगह में काम से बचने की कोशिश करके प्रयास को बचाने का एक तरीका है। यही है, आलस्य का एक पहलू कुछ भी नहीं कर रहा है जब तक कि इसे पूरा नहीं करना है, क्योंकि यह सब के बाद आवश्यक नहीं हो सकता है। आलस्य इसलिए प्रदर्शन निहितार्थ हो सकता है, और संबंधित काम जितना अधिक महंगा होगा, उतना ही आलस्य के माध्यम से हासिल करना होगा।

पायथन आलसी मूल्यांकन के लिए कई उपकरण प्रदान करता है, विशेष रूप से generator और जनरेटर अभिव्यक्ति निर्माण के माध्यम से। अपने कोड में आलसी पैटर्न का उपयोग करने के अवसरों की खोज करने के लिए पायथन में आलस्य पर पढ़ना लायक है।

Django में आलस्य

Django अपने आप में काफी आलसी है। इसका एक अच्छा उदाहरण QuerySets के मूल्यांकन में पाया जा सकता है। QuerySets आलसी हैं । इस प्रकार एक QuerySet बनाया जा सकता है, चारों ओर पारित और अन्य QuerySets के साथ संयुक्त, वास्तव में डेटाबेस के लिए किसी भी यात्रा incurring बिना यह वर्णित आइटम लाने के लिए। जो कुछ पास हो जाता है वह QuerySet ऑब्जेक्ट है, न कि उन वस्तुओं का संग्रह जो - अंततः - डेटाबेस से आवश्यक होगी।

दूसरी ओर, कुछ कार्य एक क्वेरीसेट के मूल्यांकन को बाध्य करेंगे QuerySet के समयपूर्व मूल्यांकन से बचने से डेटाबेस में एक महंगी और अनावश्यक यात्रा करने से बचा जा सकता है।

Django भी एक keep_lazy() डेकोरेटर प्रदान करता है। यह एक ऐसे कार्य की अनुमति देता है जिसे आलसी तर्क के साथ खुद को आलसी व्यवहार करने के लिए कहा जाता है, केवल तब मूल्यांकन किया जाता है जब इसकी आवश्यकता होती है। इस प्रकार आलसी तर्क - जो महंगा हो सकता है - मूल्यांकन के लिए तब तक नहीं बुलाया जाएगा जब तक कि इसकी सख्त आवश्यकता न हो।

डेटाबेस

डेटाबेस अनुकूलन

Django की डेटाबेस परत डेवलपर्स को अपने डेटाबेस से सर्वश्रेष्ठ प्रदर्शन प्राप्त करने में मदद करने के लिए विभिन्न तरीके प्रदान करती है। डेटाबेस ऑप्टिमाइज़ेशन डॉक्यूमेंटेशन संबंधित डॉक्यूमेंटेशन के लिंक को इकट्ठा करता है और विभिन्न युक्तियों को जोड़ता है जो आपके डेटाबेस उपयोग को ऑप्टिमाइज़ करने का प्रयास करते समय उठाए जाने वाले कदमों की रूपरेखा तैयार करता है।

उदाहरण के लिए, सीमित नेटवर्क प्रदर्शन के साथ वर्चुअलाइज्ड होस्ट पर यह बहुत मदद करता है।

HTTP प्रदर्शन

middleware

Django middleware कुछ सहायक टुकड़ों के साथ आता है जो आपकी साइट के प्रदर्शन को अनुकूलित करने में मदद कर सकते हैं। उनमे शामिल है:

ConditionalGetMiddleware

ETag और Last-Modified हेडर के आधार पर सशर्त रूप से GET प्रतिक्रियाओं के लिए आधुनिक ब्राउज़रों के लिए समर्थन जोड़ता है। यह जरूरत पड़ने पर एक ETag की गणना और सेट भी करता है।

GZipMiddleware

सभी आधुनिक ब्राउज़रों के लिए प्रतिक्रियाओं को नियंत्रित करता है, बैंडविड्थ की बचत और स्थानांतरण समय। ध्यान दें कि GZipMiddleware वर्तमान में एक सुरक्षा जोखिम माना जाता है, और उन हमलों की चपेट में है जो TLS / SSL द्वारा प्रदान की गई सुरक्षा को शून्य कर देते हैं। अधिक जानकारी के लिए GZipMiddleware में चेतावनी देखें।

सत्र

कैश्ड सत्रों का उपयोग करना

कैश्ड सत्रों का उपयोग डेटाबेस जैसे धीमे भंडारण स्रोत से सत्र डेटा को लोड करने की आवश्यकता को समाप्त करके प्रदर्शन को बढ़ाने का एक तरीका हो सकता है और इसके बजाय स्मृति में अक्सर उपयोग किए गए सत्र डेटा को संग्रहीत करना है।

स्थिर फाइलें

स्टैटिक फाइलें, जो परिभाषा से गतिशील नहीं हैं, अनुकूलन लाभ के लिए एक उत्कृष्ट लक्ष्य बनाती हैं।

CachedStaticFilesStorage

वेब ब्राउज़रों की कैशिंग क्षमताओं का लाभ उठाकर, आप प्रारंभिक डाउनलोड के बाद किसी दिए गए फ़ाइल के लिए नेटवर्क हिट को पूरी तरह से समाप्त कर सकते हैं।

CachedStaticFilesStorage कंटेंट पर निर्भर होने वाले टैग को CachedStaticFilesStorage भविष्य में होने वाले बदलावों के बिना उन्हें कैश में लंबे समय तक कैश किया जा सके - जब फाइल में बदलाव होगा, तो टैग, इसलिए ब्राउजर अपने आप एसेट को फिर से लोड करेंगे।

"Minification"

कई तृतीय-पक्ष Django उपकरण और पैकेज HTML, CSS, और जावास्क्रिप्ट को "छोटा" करने की क्षमता प्रदान करते हैं। वे अनावश्यक व्हाट्सएप, न्यूलाइन्स और टिप्पणियों को हटाते हैं और चर नाम को छोटा करते हैं, और इस तरह आपके द्वारा प्रकाशित दस्तावेज़ों के आकार को कम करते हैं।

खाका प्रदर्शन

ध्यान दें कि:

  • {% block %} का उपयोग करने से {% include %} का उपयोग करने से तेज है
  • कई छोटे टुकड़ों से इकट्ठा किए गए भारी-खंडित टेम्पलेट, प्रदर्शन को प्रभावित कर सकते हैं

कैश्ड टेम्पलेट लोडर

cached template loader को सक्षम करने से अक्सर प्रदर्शन में सुधार होता है, क्योंकि यह हर बार प्रत्येक टेम्पलेट को संकलित करने से बचता है जिसे उसे प्रदान करने की आवश्यकता होती है।

उपलब्ध सॉफ़्टवेयर के विभिन्न संस्करणों का उपयोग करना

यह कभी-कभी जाँचने योग्य हो सकता है कि आपके द्वारा उपयोग किए जा रहे सॉफ़्टवेयर के भिन्न और बेहतर प्रदर्शन संस्करण उपलब्ध हैं।

इन तकनीकों को अधिक उन्नत उपयोगकर्ताओं पर लक्षित किया जाता है जो पहले से ही अच्छी तरह से अनुकूलित Django साइट के प्रदर्शन की सीमाओं को धक्का देना चाहते हैं।

हालांकि, वे प्रदर्शन समस्याओं के लिए जादुई समाधान नहीं हैं, और वे उन साइटों पर सीमांत लाभ से बेहतर लाने की संभावना नहीं रखते हैं जो पहले से ही अधिक बुनियादी चीजों को सही तरीके से नहीं करते हैं।

ध्यान दें

यह दोहराने लायक है: आपके द्वारा पहले से उपयोग किए जा रहे सॉफ़्टवेयर के विकल्पों तक पहुंचना प्रदर्शन समस्याओं का पहला उत्तर नहीं है । जब आप अनुकूलन के इस स्तर तक पहुँचते हैं, तो आपको एक औपचारिक बेंचमार्किंग समाधान की आवश्यकता होती है।

नया अक्सर होता है - लेकिन हमेशा नहीं - बेहतर

कम कुशल होने के लिए अच्छी तरह से बनाए गए सॉफ़्टवेयर की एक नई रिलीज़ के लिए यह काफी दुर्लभ है, लेकिन अनुचर हर संभव उपयोग के मामले का अनुमान नहीं लगा सकते हैं - इसलिए यह जानते हुए भी कि नए संस्करणों के बेहतर प्रदर्शन की संभावना है, बस यह मत मानिए कि वे हमेशा करूंगा।

यह Django के ही सच है। क्रमिक रिलीज ने पूरे सिस्टम में कई सुधारों की पेशकश की है, लेकिन आपको अभी भी अपने आवेदन के वास्तविक-विश्व प्रदर्शन की जांच करनी चाहिए, क्योंकि कुछ मामलों में आप पा सकते हैं कि परिवर्तन का मतलब है कि यह बेहतर के बजाय बदतर प्रदर्शन करता है।

पायथन के नए संस्करण, और पायथन पैकेज के, अक्सर बेहतर भी प्रदर्शन करेंगे - लेकिन मानने के बजाय माप।

ध्यान दें

जब तक आप किसी विशेष संस्करण में एक असामान्य प्रदर्शन समस्या का सामना नहीं करते हैं, तो आप आम तौर पर एक नई रिलीज़ में बेहतर सुविधाएँ, विश्वसनीयता और सुरक्षा पाएंगे, और ये फायदे आपके द्वारा जीते या खोए किसी भी प्रदर्शन से कहीं अधिक महत्वपूर्ण हैं।

Django के टेम्पलेट भाषा के लिए विकल्प

लगभग सभी मामलों के लिए, Django की अंतर्निहित टेम्पलेट भाषा पूरी तरह से पर्याप्त है। हालाँकि, यदि आपके Django प्रोजेक्ट में अड़चनें टेम्पलेट सिस्टम में निहित हैं और आपने इसे मापने के अन्य अवसरों को समाप्त कर दिया है, तो तृतीय-पक्ष विकल्प उत्तर हो सकता है।

Jinja2 प्रदर्शन में सुधार की पेशकश कर सकता है, खासकर जब यह गति की बात आती है।

वैकल्पिक टेम्पलेट सिस्टम इस हद तक भिन्न होते हैं कि वे Django की अस्थायी भाषा को साझा करते हैं।

ध्यान दें

यदि आप टेम्प्लेट में प्रदर्शन समस्याओं का अनुभव करते हैं, तो पहली बात यह है कि वास्तव में ऐसा क्यों है। वैकल्पिक टेम्प्लेट प्रणाली का उपयोग करना तेजी से साबित हो सकता है, लेकिन वही लाभ उस परेशानी में जाए बिना भी उपलब्ध हो सकता है - उदाहरण के लिए, आपके टेम्प्लेट में महंगी प्रसंस्करण और तर्क आपके विचारों में अधिक कुशलता से किया जा सकता है।

वैकल्पिक सॉफ्टवेयर कार्यान्वयन

यह जांचने लायक हो सकता है कि क्या आप जिस पायथन सॉफ्टवेयर का उपयोग कर रहे हैं वह एक अलग कार्यान्वयन में प्रदान किया गया है जो समान कोड को तेजी से निष्पादित कर सकता है।

हालाँकि: अच्छी तरह से लिखे गए Django साइटों में अधिकांश प्रदर्शन समस्याएं पायथन निष्पादन स्तर पर नहीं हैं, बल्कि अक्षम डेटाबेस क्वेरी, कैशिंग और टेम्प्लेट में हैं। यदि आप खराब लिखे गए पायथन कोड पर भरोसा कर रहे हैं, तो आपके निष्पादन की समस्याओं के तेजी से निष्पादित होने से हल होने की संभावना नहीं है।

वैकल्पिक कार्यान्वयन का उपयोग करने से संगतता, परिनियोजन, पोर्टेबिलिटी या रखरखाव संबंधी समस्याएं आ सकती हैं। यह बिना कहे चला जाता है कि एक गैर-मानक कार्यान्वयन को अपनाने से पहले आपको यह सुनिश्चित करना चाहिए कि यह संभावित जोखिमों को कम करने के लिए आपके आवेदन के लिए पर्याप्त प्रदर्शन लाभ प्रदान करता है।

इन बातों को ध्यान में रखते हुए, आपको निम्न के बारे में पता होना चाहिए:

PyPy

PyPy , Python में ही Python का कार्यान्वयन है ('मानक' Python कार्यान्वयन C में है)। आमतौर पर हैवीवेट अनुप्रयोगों के लिए PyPy पर्याप्त प्रदर्शन लाभ प्रदान कर सकता है।

PyPy परियोजना का एक प्रमुख उद्देश्य मौजूदा Python APIs और पुस्तकालयों के साथ compatibility । Django संगत है, लेकिन आपको उन अन्य पुस्तकालयों की संगतता की जांच करने की आवश्यकता होगी जिन पर आप भरोसा करते हैं।

पायथन पुस्तकालयों के सी कार्यान्वयन

कुछ पायथन पुस्तकालयों को C में भी लागू किया जाता है, और बहुत तेजी से हो सकता है। वे एक ही एपीआई की पेशकश करने का लक्ष्य रखते हैं। ध्यान दें कि संगतता समस्याएं और व्यवहार अंतर अज्ञात नहीं हैं (और हमेशा तुरंत स्पष्ट नहीं)।