Python डेवलपर इंटरव्यू सवाल

Django app में N+1 query की समस्या आप कैसे ढूंढेंगे और ठीक करेंगे?

इंटरव्यूअर असल में क्या परख रहा है, अपना जवाब कैसे स्ट्रक्चर करें, और एक बोला हुआ उदाहरण जिसे आप अपना सकते हैं।

छोटा जवाब

पहले queries गिनकर पुष्टि करें, लोकल पर Django Debug Toolbar से या टेस्ट में assertNumQueries से। पैटर्न यह होता है कि लूप किसी related ऑब्जेक्ट को छूता है, जिससे हर row पर एक query चलती है, क्योंकि querysets lazy हैं। forward relations select_related से ठीक करें, जो join करता है, और reverse या many to many relations prefetch_related से, जो एक अतिरिक्त query चलाता है।

इंटरव्यूअर यह क्यों पूछते हैं

ORM पर बनी applications में यह सबसे आम परफॉर्मेंस बग है, इसलिए यह लगभग नौकरी की शर्त जैसा है। इंटरव्यूअर देखना चाहते हैं कि आप optimize करने से पहले मापते हैं, आप queryset की laziness को असली वजह समझते हैं, और आप जानते हैं कि select_related और prefetch_related अलग अलग तरह के relations हल करते हैं। सिर्फ पैच लगाने के बजाय regression test जोड़ना सीनियर वाला संकेत है।

अपना जवाब कैसे स्ट्रक्चर करें

  • कहें कि पहले query की गिनती मापते हैं।
  • laziness को मूल वजह बताएं।
  • select_related और prefetch_related को सही relation से जोड़ें।
  • query count वाले टेस्ट से फिक्स को पक्का करें।

उदाहरण जवाब

बोला हुआ उदाहरण, पहले व्यक्ति में

पहले माप, क्योंकि ORM की परफॉर्मेंस का अंदाजा लगाना पूरी दोपहर बर्बाद करने का तरीका है। लोकल पर मैं debug toolbar चालू करता हूं या debug level पर queries लॉग करता हूं, और अगर यह पहले से प्रोडक्शन में है तो trace देखता हूं, जहां चार सौ लगभग एक जैसे selects चलाता endpoint साफ पहचान में आ जाता है। वजह यह है कि queryset तब तक डेटाबेस को नहीं छूता जब तक आप उस पर इटरेट न करें, और हर row पर foreign key छूने से वह relation lazily आता है। forward foreign key के लिए मैं select_related जोड़ता हूं, जो उसे join और एक ही query बना देता है। reverse relations या many to many के लिए prefetch_related, जो दूसरी query चलाकर नतीजों को Python में जोड़ देता है। ठीक होने के बाद मैं view को assertNumQueries में लपेटकर अपेक्षित संख्या के साथ टेस्ट लिखता हूं, वरना अगला बंदा template में एक field जोड़ेगा और यह चुपचाप वापस बिगड़ जाएगा। एक अंदरूनी dashboard पर हमने एक पेज को करीब तीन सौ queries से चार पर लाया, और लोड टाइम लगभग दो सेकंड से घटकर दो सौ मिलीसेकंड से नीचे आ गया।

जल्दी ही यह इंटरव्यू देने जा रहे हैं? GhostPilot आपकी लाइव कॉल सुनता है, सवाल पूछे जाते ही उसे पकड़ लेता है, और रियल-टाइम में एक स्ट्रक्चर्ड जवाब आपकी स्क्रीन पर डाल देता है। अगले मॉक में इसे आजमाएं, या ले लें एक $29 Session Pass, कोई सब्सक्रिप्शन नहीं, असली इंटरव्यू के लिए।

देखें यह कैसे काम करता है

फॉलो-अप सवाल जिनकी उम्मीद रखें

  • prefetch_related, join से कब धीमा पड़ता है?
  • यहां only और defer क्या बदलते हैं?
  • कोड रिव्यू में आप इसे कैसे पकड़ेंगे?

Python डेवलपर के और सवाल

आपका इंटरव्यूअर इसका अपना वर्ज़न पूछेगा। फ्री Question Predictor में अपना असली जॉब डिस्क्रिप्शन पेस्ट कीजिए और वो 20 सवाल पाइए जो उस रोल में सबसे ज्यादा पूछे जाने की संभावना है, साथ में यह भी कि हर सवाल असल में क्या टटोल रहा है।

मेरे सवाल प्रेडिक्ट करें

मुश्किल सवाल पूछे जाने से पहले उनकी रिहर्सल कीजिए

एक लाइव कोपायलट के साथ प्रैक्टिस कीजिए, फिर तैयार होकर अंदर जाइए। $29 Session Pass आपको इंटरव्यू पार करा देता है, न कोई सब्सक्रिप्शन, न कोई लॉक-इन।

GhostPilot पाएं