+− THE DAILY DIFFdev & AI news
SHIP IT

पायथन प्रदर्शन: नेटिव नमपाई लूप्स, कॉलबैक और रूपांतरण लागत

एक नियंत्रित CPU-ओनली संख्यात्मक परीक्षण CPython लूप्स, नमपाई अंकगणित, एक पायथन कॉलबैक रैपर और एक संकलित नंबा लूप के माध्यम से समान मूल्यों का अनुसरण करता है।

Want to see our stories first on Google? Add us to your preferred sources — it helps us grow.

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

लिखित संस्करण पढ़ें (अंग्रेजी) ↗

इस वीडियो में क्या शामिल है

  • CPython स्रोत को बाइटकोड में संकलित करता है। बार-बार दुभाषिया/ऑब्जेक्ट कार्य और एक टाइप किया हुआ नेटिव संख्यात्मक लूप अलग-अलग निष्पादन व्यवस्थाएं हैं।
  • न्यूमेरिक नमपाई अंकगणित संकलित ऑपरेशनों को टाइप किए गए बैचों को सौंप सकता है; अंकगणित लूप अभी भी मौजूद है, और दृश्यों में असंतुलित लेआउट हो सकते हैं।
  • रूपांतरण और आवश्यक आउटपुट प्रतिनिधित्व को मापें। इस रन में, पायथन सूचियों को सरणियों में और वापस परिवर्तित करने से बड़े रेडी-एरे की बढ़त मिट गई।
  • छोटे कार्यभार सामान्य पायथन का पक्ष ले सकते हैं क्योंकि निश्चित एरे-कॉल लागत मायने रखती है। आठ-मूल्य कॉम्प्रिहेंशन ने इस मापी गई तुलना को जीता।
  • np.vectorize एक सुविधा रैपर है जो क्रमिक तत्वों के लिए पायथन को कॉल करता है; एक बैच इंटरफ़ेस अकेला नेटिव संख्यात्मक निष्पादन स्थापित नहीं करता है।
  • संकलित पायथन-सिंटैक्स लूप भी तेज़ हो सकते हैं। ठंडी संकलन/सेटअप लागतों को शामिल करें जब वे कॉलर के लिए मायने रखते हैं।
  • नेटिव निष्पादन, CPU SIMD, मल्टीथ्रेडिंग और GPU बैकएंड अलग-अलग विचार हैं। उपलब्ध CPU विशेषताएं किसी विशेष रन में उपयोग किए गए निर्देशों का पता नहीं लगाती हैं।

अनुवादित प्रतिलेख

मूल अंग्रेजी कथन से अनुवादित। उपलब्ध ऑडियो और कैप्शन YouTube द्वारा नियंत्रित होते हैं।

एक ही CPU पहले क्यों खत्म कर सकता है?

0:00 आपको लगता है कि पायथन को तेज़ होने के लिए एक नई भाषा की आवश्यकता है। लूप के स्थानांतरित होने के बाद उसी CPU ने हमारे बैच को तेज़ी से चलाया। काम कहाँ गया? गति कब गायब हो जाती है? कौन सा शॉर्टकट पायथन को वापस लाता है? यह The Daily Diff है, पर्दे के पीछे। उस शॉर्टकट पर नज़र रखें। CPython मानक पायथन कार्यान्वयन है।

0:17 यह आपके स्रोत को बाइटकोड में संकलित करता है, फिर उन निर्देशों को एक दुभाषिया में चलाता है। NumPy एक संख्यात्मक लाइब्रेरी है जिसके सरणी में घोषित डेटा प्रकार के साथ मान होते हैं। इसका अंतर्निहित अंकगणित एक पूरे बैच को संकलित ऑपरेशनों को सौंप सकता है। एक मिलियन फ्लोटिंग पॉइंट मान लें, प्रत्येक को वर्ग करें, फिर मूल मान जोड़ें। प्रत्येक संस्करण को समान मान मिलते हैं और मिलान करने वाले उत्तर उत्पन्न होते हैं। मान इतने छोटे हैं कि गोल करने के अंतर को दौड़ से बाहर रखा जा सके। इस मशीन पर, कॉम्प्रिहेंशन में लगभग तैंतीस मिलीसेकंड लगे।

0:40 NumPy ने एक से भी कम लिया। दोनों CPU पर चले। यह इस कार्यभार के लिए उपयोगी प्रमाण है, और एक प्रोग्रामिंग भाषा के लिए एक भयानक मृत्युलेख है। सामान्य लूप से शुरू करें। पायथन अगला मान प्राप्त करता है, अंकगणित करता है, और उत्तर जोड़ता है। फिर वह फिर से ऐसा करता है।

एक पायथन लूप क्या काम दोहराता है?

0:53 गुणा सस्ता है। अगले गुणा की व्यवस्था करना, और उसके आसपास पायथन ऑब्जेक्ट्स को संभालना, हर बार काम जोड़ता है। यह परीक्षण किए गए फ़ंक्शन का वास्तविक डिसअसेंबली है। पुनरावृत्ति, गुणा और जोड़ बाइटकोड निर्देशों के रूप में दिखाई देते हैं। पायथन संस्करण और दुभाषिया अलग-अलग विकल्प बनाते हैं। ये समय स्क्रीन पर दिखाए गए संस्करण के हैं, जो पायथन तीन दशमलव दस है। एक पायथन सूची ऑब्जेक्ट्स के संदर्भों को संग्रहीत करती है, इसलिए विभिन्न प्रकार की चीजें एक सूची को साझा कर सकती हैं।

1:14 हमारी अंकगणित का काम पूरे में संख्याओं का उपयोग करता है। यह एक दोहरावदार सेवा का अनुरोध करते हुए एक सामान्य व्यवस्था के लिए भुगतान करता है। कल्पना कीजिए कि एक ही कॉफी को दस लाख बार ऑर्डर करना और हर कप के लिए एक नया फॉर्म भरना। कॉफी मशीन ठीक है। कागजी कार्रवाई ने अपना करियर विकसित कर लिया है। NumPy अनुबंध बदलता है। यह सरणी एक घोषित प्रकार के साथ निश्चित आकार के फ्लोटिंग पॉइंट मान रखती है। हमारी सरणी सन्निहित है, इसलिए इसके मान स्मृति में एक साथ बैठते हैं।

1:36 दृश्यों में अन्य लेआउट हो सकते हैं।

नमपाई लूप को कहाँ ले जाता है?

1:38 अंकगणित ऑपरेशन जानता है कि उसे किस प्रकार का डेटा प्राप्त हो रहा है। कॉल बैच को एक नेटिव ऑपरेशन को सौंपता है। एक लूप अभी भी संकलित कोड के अंदर मानों का दौरा करता है। यह उस काम के दौरान प्रकार के ज्ञान का पुन: उपयोग कर सकता है। पायथन अभी भी वह व्यक्ति है जो काम सौंप रहा है। इतामार टर्नर ट्रॉरिंग पायथन स्पीड में अंतर बताते हैं। बैच इंटरफेस, नेटिव कार्यान्वयन और प्रोसेसर वेक्टर निर्देश अलग-अलग चीजें हैं। फ़ंक्शन का नाम बहुत कम प्रमाण प्रदान करता है। इस परिणाम ने CPU पर NumPy का उपयोग किया।

2:00 CuPy जैसे GPU बैकएंड सरणियों और ऑपरेशनों के लिए एक अलग घर चुनते हैं। एक GPU खरीदना इस साधारण पायथन लूप को वहीं चलता रहता है जहाँ वह पहले से चल रहा था। CPU वेक्टर निर्देश कई मानों को एक साथ संसाधित कर सकते हैं। NumPy में समर्थित कर्नेल चुनने के लिए मशीनरी है।

क्या तेज़ का मतलब GPU या कई CPU कोर है?

2:13 हमारे रनटाइम उपलब्ध सुविधाओं की रिपोर्ट करता है, लेकिन इस अभिव्यक्ति के निर्देशों का पता नहीं लगाता है। वेक्टर निर्देशों को पूरा मापा गया लाभ देना सबूतों को अतिरंजित करेगा। GPU शॉपिंग कार्ट बंद रह सकती है। प्रदर्शन सुधार के बारे में कुछ गहरा संतोषजनक है जो एक खरीद को भी रद्द कर देता है। दुर्भाग्य से, बेंचमार्क जारी रहता है। आठ मूल्यों के साथ, कॉम्प्रिहेंशन जीता। एरे मशीनरी को कॉल करने में छोटे काम से अधिक लागत आई। बड़े रेडी सरणियाँ आगे बढ़ गईं। हमने बार-बार परीक्षण और एक गर्म प्रक्रिया का उपयोग किया। नए पायथन बिल्ड क्रॉसओवर को बदल सकते हैं।

2:40 फिर बदलें कि एप्लिकेशन को क्या चाहिए। एक पायथन सूची से शुरू करें और एक नई पायथन सूची के साथ समाप्त करें। NumPy को इनपुट को एक सरणी में बदलना होगा और उत्तर को वापस पायथन ऑब्जेक्ट्स में बदलना होगा। यदि आपके एप्लिकेशन को उनकी आवश्यकता है, तो वे कदम बिल में शामिल हैं।

शानदार गति कब गायब हो जाती है?

2:49 एक मिलियन मूल्यों पर, उस पूर्ण पथ में लगभग अट्ठाईस मिलीसेकंड लगे। कॉम्प्रिहेंशन में भी लगभग अट्ठाईस लगे। हमारी नाटकीय बढ़त लगभग बराबरी में बदल गई। तेज़ हिस्सा वास्तविक था। लाभ डेटा को उसके संख्यात्मक रूप में रहने देने पर निर्भर करता था। डेटा का पालन करें। यदि अगला ऑपरेशन एक सरणी स्वीकार करता है, तो सरणी को रखें। यदि आप सूचियों और सरणियों के बीच बार-बार परिवर्तित करते हैं,

3:11 उन क्रॉसिंगों को मापें। एक महंगी हैंडऑफ़ से पहले रुकने से गलत प्रश्न के लिए सटीक संख्याएँ मिलती हैं। इस सरणी को गुणा करने से एक अस्थायी परिणाम बनता है। मूल मानों को जोड़ने से आउटपुट बनता है। नेटिव निष्पादन को अभी भी मेमोरी और डेटा को स्थानांतरित करने की आवश्यकता है। कुछ ऑपरेशन एक आउटपुट बफर स्वीकार करते हैं, जब आपका कोड इसे सुरक्षित रूप से पुन: उपयोग कर सकता है तो आवंटन कम हो जाता है। एक सुंदर पंक्ति कई बड़े बफ़र्स का ऑर्डर दे सकती है।

बेंचमार्क में कौन सी सीमाएँ शामिल हैं?

3:28 पायथन स्पीड इस समस्या को भी उजागर करता है। एलोकेटर आपकी सौंदर्यशास्त्र के प्रति उल्लेखनीय रूप से उदासीन है। आप लूप सिंटैक्स को भी रख सकते हैं और उसके निष्पादन को बदल सकते हैं। Numba समर्थित संख्यात्मक पायथन फ़ंक्शन को नेटिव कोड में संकलित कर सकता है। यहां हमारे परीक्षण का लूप उसके कंपाइलर डेकोरेटर के साथ है। यह अभी भी 'for' कहता है। महंगा दुभाषिया पथ बदल गया है। संकलन के बाद, इस लूप में रेडी सरणियों के साथ आधे मिलीसेकंड से भी कम समय लगा। इस रन में संकलन में ही लगभग एक सेकंड लगा।

3:47 वह सेटअप लागत बार-बार के समय से बाहर रखी गई थी, इसलिए एक छोटे से एक बार के काम के लिए एक अलग तुलना की आवश्यकता है। Numba की अपनी गाइड स्पष्ट लूप दिखाने में खुश है। हॉट पाथ खोजने से पहले भाषा प्रवासन शुरू करना एक प्रोफाइल्स खोलने से बचने का एक विस्तृत तरीका है।

क्या एक संकलित पायथन लूप भी तेज़ हो सकता है?

4:00 पहले पता करें कि समय का उपभोग क्या करता है। नेटवर्क प्रतीक्षा, ऑब्जेक्ट पार्सिंग और थोक अंकगणित के लिए अलग-अलग सुधारों की आवश्यकता होती है। नेटिव सरणी संचालन तब मदद करते हैं जब गणना और डेटा फिट होते हैं। मापें कि आपके कॉलर को वास्तव में क्या परिणाम चाहिए। अब उस शॉर्टकट के लिए। आपके पास एक पायथन फ़ंक्शन है और आप चाहते हैं कि वह एक सरणी स्वीकार करे। वेक्टरिज़ नामक एक रैपर लापता प्रदर्शन बटन जैसा लगता है। इसके दस्तावेज़ में एक महत्वपूर्ण वाक्य प्रतीक्षा कर रहा है।

4:22 NumPy का कहना है कि इसका vectorize रैपर मुख्य रूप से सुविधा के लिए प्रदान किया जाता है। इसका कार्यान्वयन अनिवार्य रूप से एक for लूप है। रैपर बैचों को स्वीकार करता है, लेकिन क्रमिक तत्वों के लिए आपके पायथन फ़ंक्शन को कॉल करता रहता है। इंटरफ़ेस छोटा हो गया। निष्पादन सीमा व्यस्त रही। देखें कि वही मान पायथन कॉलबैक के माध्यम से वापस आते हैं। रेडी सरणियों के साथ, इस संस्करण में लगभग सतासी मिलीसेकंड लगे। यह हमारे कॉम्प्रिहेंशन से धीमा था। एक उपयोगी ब्रॉडकास्टिंग रैपर सटीक प्रति-तत्व कार्य को बनाए रख सकता है जिसे आप हटाने की कोशिश कर रहे थे।

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

np.vectorize वास्तव में क्या निष्पादित करता है?

4:56 मेरा फैसला एक मापा संख्यात्मक हॉट पाथ को बैच करने के लिए SHIP IT है। सामान्य लूपों को तब रखें जब वे पहले से ही अच्छा काम करते हों। जांच करें कि काम कहाँ होता है और अगले कॉलर को क्या चाहिए। सब्सक्राइब करें, घंटी दबाएं, और मुझे टिप्पणियों में बताएं कि क्या आपने इसे अलग तरह से मुहर लगाई होगी। और आज के लिए यह अंतर है। मैं Axrisi से निको हूं। जिम्मेदारी से विलय करें। क्या आपने इसे अलग तरह से मुहर लगाई होगी?

5:18 मुझे टिप्पणियों में बताएं। आज के लिए यह अंतर है। मैं Axrisi से निको हूं। जिम्मेदारी से विलय करें। मुझे टिप्पणियों में बताएं। आज के लिए यह अंतर है। मैं Axrisi से निको हूं। जिम्मेदारी से विलय करें।

आपको अपने कोड में क्या बदलना चाहिए?

5:41 क्या आपने इसे अलग तरह से मुहर लगाई होगी? मुझे टिप्पणियों में बताएं। आज के लिए यह अंतर है। मैं Axrisi से निको हूं। जिम्मेदारी से विलय करें। मुझे टिप्पणियों में बताएं। आज के लिए यह अंतर है।

स्रोत

  1. Universal functions (ufunc) basics — NumPy 2.2NumPy
  2. The N-dimensional array — NumPy 2.2NumPy
  3. numpy.vectorize — convenience and performance notesNumPy
  4. CPU/SIMD optimizations — NumPy 2.2NumPy
  5. dis — Disassembler for Python bytecodePython Software Foundation
  6. CPython 3.10.12 list representationCPython contributors
  7. The limits of Python vectorization as a performance techniqueItamar Turner-Trauring / Python⇒Speed
  8. Performance TipsNumba
  9. Basics of CuPyCuPy

संबंधित वीडियो

under-the-hood · hi · 8 अक्टू॰ 2026

पोलर्स 2.0: जॉइन अब अपनी पंक्ति क्रम को क्यों नहीं रखते

पोलर्स 2.0 डिफ़ॉल्ट रूप से स्ट्रीमिंग इंजन पर कलेक्ट चलाता है। जॉइन, ग्रुप-बाय और अनपिवट के लिए, रिलीज़ अब इनपुट पंक्ति क्रम की गारंटी नहीं देता है जब तक कि आप स्पष्ट रूप से मेंटेन_ऑर्डर या सॉर्ट सेट

2:31 ↗
under-the-hood · hi · 12 अक्टू॰ 2026

हगिंग फेस मॉडल फाइलें छिपे हुए कोड को चला सकती हैं

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

3:33 ↗
under-the-hood · hi · 11 अक्टू॰ 2026

जब प्रतिक्रिया गायब हो जाती है तो स्ट्राइप आपके अनुरोध को याद रखता है

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

2:54 ↗
under-the-hood · hi · 10 अक्टू॰ 2026

शॉपिफाई ने इन्वेंटरी आरक्षणों को MySQL में स्थानांतरित कर दिया

शॉपिफाई ने अपनी इन्वेंट्री आरक्षण प्रणाली को रेडिस से MySQL डेटाबेस में स्थानांतरित कर दिया, जिसमें पहले से ही इन्वेंट्री लेजर मौजूद था। व्यक्तिगत रूप से लॉक करने योग्य इकाई पंक्तियों का एक सीमित पूल

2:58 ↗