2011-10-04 13 views
7

मैं Django का उपयोग कर एक वेबसाइट चला रहा हूं, और मैं डीबगिंग को आसान बनाने के लिए लगभग सभी स्क्रिप्ट की शुरुआत में आईपीडीबी आयात करता हूं। हालांकि, अधिकांश समय मैं मॉड्यूल से फ़ंक्शंस का उपयोग नहीं करता (केवल तभी जब मैं डिबगिंग कर रहा हूं)।क्या मॉड्यूल आयात करना (लेकिन इसका उपयोग नहीं करना) पायथन में प्रदर्शन कम करता है?

बस सोच, यह मेरा प्रदर्शन में कमी होगी?

ipdb.set_trace() 

के रूप में करने का विरोध किया:

import ipdb; ipdb.set_trace() 

लेकिन मैं जो मुझे आश्चर्य बनाता है कई स्थानों में किया दूसरा उदाहरण, देखा है यह सिर्फ है कि मैं लिखने के लिए पसंद करते हैं जब मैं एक ब्रेकप्वाइंट का निर्माण करना चाहते है अगर यह और अधिक कुशल है ...

मैं बस पता नहीं कैसे अजगर मॉड्यूल आयात करने दक्षता से संबंधित है (आप अपनी स्क्रिप्ट के भीतर मॉड्यूल तरीकों का उपयोग कर नहीं कर रहे हैं यह सोचते हैं)।

उत्तर

4

जैसा कि @WRAR उल्लेख किया गया है, एक मॉड्यूल लोड करना किसी भी मात्रा में कोड निष्पादित करने का संकेत दे सकता है जो किसी भी समय ले सकता है। दूसरी ओर, मॉड्यूल केवल एक बार लोड किया जाएगा और आयात करने के बाद के किसी भी प्रयास को मॉड्यूल को os.sys.modules में प्रस्तुत किया जाएगा और इसके संदर्भ में।

मोड debuging में एक Django वातावरण में, मॉड्यूल Django के AppCache से निकाल दिए जाते हैं और वास्तव में केवल फिर से आयातित जब वे बदल रहे हैं, जो आप शायद ipdb साथ काम नहीं चलेगा, तो आपके मामले में यह कोई मुद्दा नहीं होना चाहिए।

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

# much used module: mymodule 
def set_trace(): 
    import ipdb 
    ipdb.set_trace() 
मॉड्यूल आप उपयोग करना चाहते में

ipdb.set_trace:

import mymodule 

mymodule.set_trace() 

या, अपने मॉड्यूल के शीर्ष पर, पार मॉड्यूल __debug__ चर का उपयोग:

if __debug__: 
    from ipdp import set_trace 
else: 
    def set_trace(): return 
+0

क्या मॉड्यूल आयात करना (लेकिन इसका उपयोग नहीं करना) पायथन में प्रदर्शन कम करता है? यही प्रश्न – joaquin

+1

दरअसल @ joaquin, जब आप अपनी टिप्पणी लिखते थे, तो मैं पहले से ही अपने उपरोक्त संपादन की प्रक्रिया में था;)। कुछ लोग इस बात से सहमत नहीं हो सकते हैं, लेकिन यह समस्या में रुचि रखने के लिए कुछ समस्या सुलझाने वाली उन्मुख सलाह देने के लिए भी एक महान जगह है। – Remi

+0

धन्यवाद! और मैंने व्यावहारिक उदाहरणों की सराहना की। =) –

2

लघु जवाब: आम तौर पर नहीं

लांग जवाब:

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

@wRar बताते हैं के रूप में, एक मॉड्यूल आयात करने कोड के किसी भी राशि पर अमल कर सकते हैं। मॉड्यूल स्टार्टअप पर आप जो भी कोड निष्पादित करना चाहते हैं उसके पास हो सकता है। हालांकि, अधिकांश मॉड्यूल स्टार्टअप के दौरान कोड की अनुचित मात्रा को निष्पादित करने से बचते हैं। तो शायद यह शायद एक बड़ा कारण नहीं है।

हालांकि, बहुत बड़े मॉड्यूल विशेष रूप से उन भी कि सी मॉड्यूल की एक बड़ी संख्या का आयात समय लगेगा में परिणाम का आयात।

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

+0

@ जेबेर्नर्डो: आप सही हैं, मैंने इसे देखा है, और 'scipy' अभी तक धीमा है, इसलिए मैं आमतौर पर केवल उन कार्यों को आयात करता हूं जो मैं वास्तव में उपयोग करता हूं ('scipy import foo, bar, spam' से) – heltonbiker

+1

लोड हो रहा है एक मॉड्यूल कोड की किसी भी मात्रा को निष्पादित करने का संकेत दे सकता है जो कि किसी भी समय ले सकता है। – wRAR

+0

@WRAR, आप सही हैं। –

0

एक मॉड्यूल आयात कर रहा है, लेकिन यह decre का उपयोग नहीं ases (सिस्टम) प्रदर्शन:

  1. यह मॉड्यूल
  2. आयातित मॉड्यूल

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

संबंधित मुद्दे