पाइथन प्रदर्शन: नेटिभ नम्पाइ लूप, कलब्याक र रूपान्तरण लागत
एक नियन्त्रित सीपीयू-मात्र संख्यात्मक परीक्षणले समान मानहरूलाई सिपी-पाइथन लूप, नम्पाइ अंकगणित, पाइथन कलब्याक र्यापर र कम्पाइल गरिएको नम्बा लूप मार्फत पछ्याउँछ।
एक नियन्त्रित सीपीयू-मात्र संख्यात्मक परीक्षणले समान मानहरूलाई सिपी-पाइथन लूप, नम्पाइ अंकगणित, पाइथन कलब्याक र्यापर र कम्पाइल गरिएको नम्बा लूप मार्फत पछ्याउँछ। तयार-इनपुट नम्पाइको ठूलो अग्रता थियो, जबकि पाइथन सूचीहरूबाट र फेरि पाइथन सूचीहरूमा रूपान्तरण गर्दा त्यो फाइदा लगभग बराबरीमा घट्यो। यस एपिसोडले कार्यान्वयन सीमा र एउटा अनुप्रयोगलाई आवश्यक पर्ने परिणाम कसरी मापन गर्ने भनेर व्याख्या गर्दछ।
लिखित संस्करण पढ्नुहोस् (अंग्रेजी) ↗
यो भिडियोले के समेट्छ
- 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 दृश्यहरूमा अन्य लेआउटहरू हुन सक्छन्। अंकगणित कार्यलाई यसले कस्तो प्रकारको डेटा प्राप्त गरिरहेको छ भन्ने थाहा हुन्छ। कलले ब्याचलाई नेटिभ कार्यमा हस्तान्तरण गर्छ। कम्पाइल गरिएको कोड भित्र एउटा लूपले अझै पनि मानहरूलाई भ्रमण गर्छ। यसले त्यो काम भरि प्रकारको ज्ञान पुनः प्रयोग गर्न सक्छ। पाइथन काम हस्तान्तरण गर्ने व्यक्ति नै रहन्छ। इटामर टर्नर ट्रोरिङले पाइथन स्पीडमा भिन्नता बताउँछन्। ब्याच इन्टरफेस, नेटिभ कार्यान्वयन र प्रोसेसर भेक्टर निर्देशनहरू
2:00 अलग-अलग चीजहरू हुन्। प्रकार्य नामले धेरै कम प्रमाण प्रदान गर्दछ। यो नतिजाले CPU मा NumPy प्रयोग गर्यो। CuPy जस्ता GPU ब्याकएन्डले एरे र कार्यहरूका लागि फरक घर छान्छ। GPU खरिद गर्दा यो सामान्य पाइथन लूप पहिले नै चलिरहेको ठाउँमा नै चल्छ।
के छिटो भनेको GPU वा धेरै CPU कोर हो?
2:13 CPU भेक्टर निर्देशनहरूले धेरै मानहरू सँगै प्रक्रिया गर्न सक्छन्। NumPy सँग समर्थित कर्नेलहरू छनौट गर्न मेसिनरी छ। हाम्रो रनटाइमले उपलब्ध सुविधाहरू रिपोर्ट गर्छ, तर यो अभिव्यक्तिको निर्देशनहरू ट्रेस गर्दैन। भेक्टर निर्देशनहरूलाई सम्पूर्ण मापन गरिएको लाभ दिनुले प्रमाणलाई अतिशयोक्तिपूर्ण बनाउँछ। GPU किनमेल कार्ट बन्द रहन सक्छ। प्रदर्शन सुधारको बारेमा केही गहिरो सन्तोषजनक कुरा छ जसले खरिद पनि रद्द गर्दछ। दुर्भाग्यवश, बेन्चमार्क जारी छ।
2:40 आठ मानहरूसँग, कम्प्रिहेन्सनले जित्यो। एरे मेसिनरीलाई कल गर्दा सानो काम भन्दा बढी खर्च भयो। ठूला तयार एरेहरू अगाडि बढे।
प्रभावशाली गति वृद्धि कहिले गायब हुन्छ?
2:49 हामीले बारम्बार परीक्षण र न्यानो प्रक्रिया प्रयोग गर्यौं। नयाँ पाइथन निर्माणहरूले क्रसओभर परिवर्तन गर्न सक्छन्। त्यसपछि अनुप्रयोगलाई के चाहिन्छ परिवर्तन गर्नुहोस्। पाइथन सूचीबाट सुरु गर्नुहोस् र ताजा पाइथन सूचीबाट समाप्त गर्नुहोस्। NumPy ले इनपुटलाई एरेमा रूपान्तरण गर्नुपर्छ र उत्तरलाई फेरि पाइथन वस्तुहरूमा फर्काउनु पर्छ। यदि तपाईंको अनुप्रयोगलाई ती चरणहरू आवश्यक पर्छन् भने, ती बिलमा पर्छन्। दश लाख मानहरूमा, त्यो पूर्ण पथलाई लगभग अठ्ठाइस मिलिसेकेन्ड लाग्यो। कम्प्रिहेन्सनलाई पनि लगभग अठ्ठाइस लाग्यो।
3:11 हाम्रो नाटकीय अग्रता लगभग बराबरीमा परिणत भयो। छिटो भाग वास्तविक थियो। फाइदा डाटालाई यसको संख्यात्मक रूपमा रहन दिनुमा निर्भर थियो। डाटा पछ्याउनुहोस्। यदि अर्को कार्यले एरे स्वीकार गर्छ भने, एरे राख्नुहोस्। यदि तपाईं बारम्बार सूचीहरू र एरेहरू बीच रूपान्तरण गर्नुहुन्छ भने,
कुन सीमाहरू बेन्चमार्कमा पर्छन्?
3:28 ती क्रसिङहरू मापन गर्नुहोस्। महँगो ह्यान्डअफ भन्दा पहिले रोकिदा गलत प्रश्नको लागि सही संख्याहरू दिन्छ। यो एरे गुणा गर्दा एक अस्थायी परिणाम सिर्जना हुन्छ। मूल मानहरू जोड्दा आउटपुट सिर्जना हुन्छ। नेटिभ कार्यान्वयनलाई अझै पनि मेमोरी चाहिन्छ र डेटा सार्छ। केही कार्यहरूले आउटपुट बफर स्वीकार गर्छन्, तपाईंको कोडले यसलाई सुरक्षित रूपमा पुनः प्रयोग गर्न सक्दा आवंटनहरू घटाउँछन्। एउटा सुन्दर रेखाले धेरै ठूला बफरहरू अर्डर गर्न सक्छ। पाइथन स्पीडले पनि यो समस्यालाई उठाउँछ।
3:47 आवंटक तपाईंको सौन्दर्यशास्त्र प्रति उल्लेखनीय रूपमा उदासीन छ। तपाईं लूप सिन्ट्याक्स पनि राख्न सक्नुहुन्छ र यसको कार्यान्वयन परिवर्तन गर्न सक्नुहुन्छ। Numba ले समर्थित संख्यात्मक पाइथन प्रकार्यहरूलाई नेटिभ कोडमा कम्पाइल गर्न सक्छ। यहाँ हाम्रो परीक्षणबाट यसको कम्पाइलर डेकोरेटरसँगको लूप छ। यसले अझै पनि 'for' भन्छ।
के कम्पाइल गरिएको पाइथन लूप पनि छिटो हुन सक्छ?
4:00 महँगो व्याख्याकर्ता पथ परिवर्तन भएको छ। कम्पाइलेसन पछि, यस लूपलाई तयार एरेहरूसँग आधा मिलिसेकेन्ड भन्दा कम लाग्यो। यस रनमा कम्पाइलेसनलाई लगभग एक सेकेन्ड लाग्यो। त्यो सेटअप लागत दोहोरिएको समयबाट बाहिर राखिएको थियो, त्यसैले एउटा सानो एक-पटकको कामले फरक तुलनाको हकदार छ। Numba को आफ्नै गाइड स्पष्ट लूपहरू देखाउन खुसी छ। हट पाथ पत्ता लगाउनु अघि भाषा माइग्रेसन सुरु गर्नु एक विस्तृत तरिका हो प्रोफाइलर खोल्नबाट बच्न। पहिले के कुराले समय खपत गर्छ पत्ता लगाउनुहोस्।
4:22 नेटवर्क प्रतीक्षा, वस्तु पार्सिङ र बल्क अंकगणितले फरक समाधानहरूका लागि आह्वान गर्दछ। नेटिभ एरे कार्यहरूले गणना र डाटा मिल्दा मद्दत गर्दछ। तपाईंको कलरलाई वास्तवमा के चाहिन्छ त्यो परिणाम मापन गर्नुहोस्। अब त्यो सर्टकटको लागि। तपाईंसँग पाइथन प्रकार्य छ र यसलाई एरे स्वीकार गर्न चाहनुहुन्छ। vectorize नामक र्यापर हराइरहेको प्रदर्शन बटन जस्तो सुनिन्छ। यसको कागजातमा एउटा महत्त्वपूर्ण वाक्य पर्खिरहेको छ। NumPy भन्छ कि यसको vectorize र्यापर मुख्यतया सुविधाका लागि प्रदान गरिएको हो।
4:43 यसको कार्यान्वयन अनिवार्य रूपमा एउटा for लूप हो। र्यापरले ब्याचहरू स्वीकार गर्छ, तर क्रमिक तत्वहरूका लागि तपाईंको पाइथन प्रकार्यलाई कल गरिरहन्छ। इन्टरफेस छोटो भयो। कार्यान्वयन सीमा व्यस्त रह्यो। पाइथन कलब्याक मार्फत उही मानहरू फिर्ता आउँदै गरेको हेर्नुहोस्।
np.vectorize ले वास्तवमा के कार्यान्वयन गर्छ?
4:56 तयार एरेहरूसँग, यो संस्करणलाई लगभग अठ्ठासी मिलिसेकेन्ड लाग्यो। यो हाम्रो कम्प्रिहेन्सन भन्दा ढिलो थियो। एक उपयोगी ब्रोडकास्टिङ र्यापरले तपाईंले हटाउन खोज्नुभएको प्रति-तत्व कार्यलाई सुरक्षित राख्न सक्छ। ब्याच इन्टरफेस पछाडिको कार्यान्वयन जाँच गर्नुहोस्, उपयुक्त डेटालाई यसको उपयोगी रूपमा राख्नुहोस्, र तुलनामा रूपान्तरण समावेश गर्नुहोस्। नेटिभ, कलब्याक र कम्पाइल गरिएका लूपहरू कलरको कुर्सीबाट समान देखिन सक्छन्। vectorize नामले एउटा प्रतिज्ञा गर्यो जुन तपाईंको स्टपवाचले कहिल्यै हस्ताक्षर गरेन। सुविधा नै तपाईंलाई चाहिएको कुरा हो भने यसलाई राख्नुहोस्। प्रदर्शनका लागि, चल्ने लूप जाँच गर्नुहोस्।
5:18 मेरो फैसला शिप इट हो, मापन गरिएको संख्यात्मक हट पाथलाई ब्याचिङको लागि। सामान्य लूपहरूलाई राम्ररी काम गर्दा राख्नुहोस्। काम कहाँ हुन्छ र अर्को कलरलाई के चाहिन्छ जाँच गर्नुहोस्। सदस्यता लिनुहोस्, घण्टी थिच्नुहोस्, र टिप्पणीहरूमा मलाई बताउनुहोस् यदि तपाईंले यसलाई फरक तरिकाले स्ट्याम्प गर्नुहुने थियो। र आजको लागि यति नै diff। म Axrisi बाट निको हुँ। जिम्मेवारीपूर्वक मर्ज गर्नुहोस्। You think Python needs a new language to get fast.
तपाईंले आफ्नो कोडमा के परिवर्तन गर्नुपर्छ?
5:41 The same CPU ran our batch faster after the loop moved. Where did the work go? When does the speedup vanish? Which shortcut brings Python back? This is The Daily Diff, under the hood. Keep an eye on that shortcut. CPython is the standard Python implementation.
स्रोतहरू
- Universal functions (ufunc) basics — NumPy 2.2NumPy
- The N-dimensional array — NumPy 2.2NumPy
- numpy.vectorize — convenience and performance notesNumPy
- CPU/SIMD optimizations — NumPy 2.2NumPy
- dis — Disassembler for Python bytecodePython Software Foundation
- CPython 3.10.12 list representationCPython contributors
- The limits of Python vectorization as a performance techniqueItamar Turner-Trauring / Python⇒Speed
- Performance TipsNumba
- Basics of CuPyCuPy



