+− THE DAILY DIFFdev & AI news
SHIP IT

पायथन कार्यप्रदर्शन: नेटिव्ह NumPy लूप्स, कॉलबॅक्स आणि रूपांतरण खर्च

एक नियंत्रित CPU-केवळ अंकीय चाचणी CPython लूप्स, NumPy अंकगणित, पायथन कॉलबॅक रॅपर आणि संकलित नम्बा लूपद्वारे समान मूल्यांचे अनुसरण करते.

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

एक नियंत्रित CPU-केवळ अंकीय चाचणी CPython लूप्स, NumPy अंकगणित, पायथन कॉलबॅक रॅपर आणि संकलित नम्बा लूपद्वारे समान मूल्यांचे अनुसरण करते. रेडी-इनपुट NumPy ला मोठी आघाडी होती, तर पायथन सूचीमधून आणि पुन्हा रूपांतरित केल्याने ती आघाडी जवळपास बरोबरीवर आली. हा भाग कार्यान्वयन सीमा आणि ॲप्लिकेशनला आवश्यक असलेले परिणाम कसे मोजावे हे स्पष्ट करतो.

लिखित आवृत्ती वाचा (इंग्रजी) ↗

या व्हिडिओमध्ये काय समाविष्ट आहे

  • CPython स्रोतला बाइटकोडमध्ये संकलित करते. पुनरावृत्त इंटरप्रिटर/ऑब्जेक्ट कार्य आणि टाइप केलेला नेटिव्ह न्यूमेरिक लूप हे भिन्न कार्यान्वयन व्यवस्था आहेत.
  • न्यूमेरिक NumPy अंकगणित संकलित ऑपरेशन्सला टाइप केलेल्या बॅचेस देऊ शकते; अंकगणित लूप अजूनही अस्तित्वात आहे आणि दृश्यांमध्ये गैर-संलग्न लेआउट असू शकतात.
  • रूपांतरण आणि आवश्यक आउटपुट प्रतिनिधित्व मोजा. या रनमध्ये, पायथन सूचींना ॲरेमध्ये रूपांतरित करणे आणि परत करणे यामुळे मोठ्या रेडी-ॲरेची आघाडी नाहीशी झाली.
  • लहान कार्यभार सामान्य पायथनला अनुकूल करू शकतात कारण निश्चित ॲरे-कॉल खर्च महत्त्वाचे असतात. आठ-मूल्यांच्या कॉम्प्रिहेन्शनने ही मोजलेली तुलना जिंकली.
  • 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 या वेळा स्क्रीनवरील आवृत्तीशी संबंधित आहेत, जी पायथन तीन पॉईंट दहा आहे. पायथन सूची ऑब्जेक्ट्सचे संदर्भ साठवते, त्यामुळे वेगवेगळ्या प्रकारच्या गोष्टी एका सूचीमध्ये सामायिक केल्या जाऊ शकतात. आमचे अंकगणित काम सर्वत्र संख्या वापरते. ते पुनरावृत्ती सेवेची मागणी करताना सामान्य व्यवस्थेसाठी पैसे देते. कल्पना करा की तुम्ही एक दशलक्ष वेळा तीच कॉफी ऑर्डर करत आहात आणि प्रत्येक कपसाठी एक नवीन फॉर्म भरत आहात. कॉफी मशीन ठीक आहे.

1:36 पेपरवर्कने स्वतःची कारकीर्द विकसित केली आहे.

NumPy लूप कुठे हलवते?

1:38 NumPy करार बदलतो. हा ॲरे एका घोषित प्रकारासह निश्चित आकाराची फ्लोटिंग पॉइंट मूल्ये धारण करतो. आमचा ॲरे सलग आहे, त्यामुळे त्याची मूल्ये मेमरीमध्ये एकत्र बसलेली आहेत. दृश्यांमध्ये इतर लेआउट असू शकतात. अंकगणित ऑपरेशनला कोणत्या प्रकारचे डेटा प्राप्त होत आहे हे माहित आहे. कॉल बॅचला नेटिव्ह ऑपरेशनला देतो. संकलित कोडमध्ये एक लूप अजूनही मूल्यांना भेट देतो. ते त्या कामामध्ये प्रकाराचे ज्ञान पुन्हा वापरू शकते.

2:00 पायथन अजूनही काम देणारी व्यक्ती आहे. इतामार टर्नर ट्रॉरिंग Python Speed मध्ये हा फरक स्पष्ट करतात. बॅच इंटरफेस, नेटिव्ह अंमलबजावणी आणि प्रोसेसर वेक्टर सूचना या वेगळ्या गोष्टी आहेत. फंक्शनचे नाव खूप कमी पुरावे पुरवते.

वेगवान म्हणजे GPU की अनेक CPU कोअर्स?

2:13 या निकालात CPU वर NumPy वापरला गेला. CuPy सारखे GPU बॅकेंड ॲरे आणि ऑपरेशन्ससाठी वेगळे घर निवडते. GPU खरेदी केल्याने हा सामान्य पायथन लूप जिथे आधीच चालू होता तिथेच चालू राहतो. CPU वेक्टर सूचना अनेक मूल्यांवर एकत्र प्रक्रिया करू शकतात. समर्थित कर्नेल निवडण्यासाठी NumPy कडे यंत्रणा आहे. आमची रनटाइम उपलब्ध वैशिष्ट्ये अहवाल देते, परंतु या अभिव्यक्तीच्या सूचनांचा मागोवा घेत नाही. वेक्टर सूचनांना संपूर्ण मोजलेला फायदा देणे हे पुराव्याला जास्त विकणे होईल.

2:40 GPU शॉपिंग कार्ट बंद राहू शकते. कार्यक्षमतेच्या दुरुस्तीबद्दल काहीतरी खूप समाधानकारक आहे जे खरेदी देखील रद्द करते. दुर्दैवाने, बेंचमार्क चालू आहे.

आश्चर्यकारक वेग कधी अदृश्य होतो?

2:49 आठ मूल्यांसह, कॉम्प्रिहेन्शन जिंकले. ॲरे यंत्रणेला कॉल करण्याचा खर्च लहान कामापेक्षा जास्त होता. मोठे तयार ॲरे पुढे गेले. आम्ही अनेक चाचण्या आणि एक गरम प्रक्रिया वापरली. नवीन पायथन बिल्ड क्रॉसओव्हर बदलू शकतात. मग ॲप्लिकेशनला काय हवे आहे ते बदला. पायथन सूचीने सुरू करा आणि नवीन पायथन सूचीने समाप्त करा. NumPy ला इनपुटला ॲरेमध्ये रूपांतरित करावे लागते आणि उत्तर पुन्हा पायथन

3:11 ऑब्जेक्ट्समध्ये बदलावे लागते. आपल्या ॲप्लिकेशनला या चरणांची आवश्यकता असल्यास ते बिलामध्ये समाविष्ट केले जातात. दहा लाख मूल्यांवर, तो संपूर्ण मार्ग सुमारे अठ्ठावीस मिलीसेकंद लागला. कॉम्प्रिहेन्शनलाही सुमारे अठ्ठावीस लागले. आमची नाट्यमय आघाडी जवळपास बरोबरीवर आली. जलद भाग खरा होता. फायदा डेटाला त्याच्या अंकीय स्वरूपात राहू देण्यावर अवलंबून होता.

बेंचमार्कमध्ये कोणत्या सीमा येतात?

3:28 डेटाचे अनुसरण करा. पुढील ऑपरेशन ॲरे स्वीकारत असल्यास, ॲरे ठेवा. जर तुम्ही सूची आणि ॲरेमध्ये वारंवार रूपांतरित करत असाल, ते क्रॉसिंग मोजा. महागड्या हँडऑफपूर्वी थांबल्यास चुकीच्या प्रश्नासाठी अचूक संख्या मिळतात. या ॲरेला गुणाकार केल्याने एक तात्पुरता परिणाम तयार होतो. मूळ मूल्ये जोडल्याने आउटपुट तयार होते. नेटिव्ह कार्यान्वयनाला अजूनही मेमरी आणि डेटा हलवण्याची आवश्यकता असते.

3:47 काही ऑपरेशन्स आउटपुट बफर स्वीकारतात, ज्यामुळे तुमचा कोड सुरक्षितपणे पुन्हा वापरू शकत असल्यास वाटप कमी होते. एक सुंदर ओळ अनेक मोठे बफर ऑर्डर करू शकते. Python Speed या समस्येचाही उल्लेख करते. ॲलोकेटर तुमच्या सौंदर्याकडे लक्ष देत नाही.

संकलित पायथन लूप देखील वेगवान असू शकते का?

4:00 तुम्ही लूप सिंटॅक्स देखील ठेवू शकता आणि त्याचे कार्यान्वयन बदलू शकता. Numba समर्थित अंकीय पायथन फंक्शन्सला नेटिव्ह कोडमध्ये संकलित करू शकते. येथे आमच्या चाचणीतील लूप त्याच्या कंपाइलर डेकोरेटरसह आहे. ते अजूनही for म्हणते. महागडा इंटरप्रिटर मार्ग बदलला आहे. संकलननंतर, रेडी ॲरेसह या लूपला अर्ध्या मिलीसेकंदपेक्षा कमी वेळ लागला. या रनमध्ये संकलनाला सुमारे एक सेकंद लागला. तो सेटअप खर्च पुनरावृत्त वेळेतून वगळण्यात आला,

4:22 त्यामुळे एका लहान एकवेळच्या कामासाठी वेगळी तुलना आवश्यक आहे. नम्बाचे स्वतःचे मार्गदर्शक स्पष्ट लूप्स दाखवण्यास आनंदित आहे. हॉट पाथ शोधण्यापूर्वी भाषा स्थलांतर सुरू करणे हे एक विस्तृत मार्ग आहे प्रोफाइलर न उघडण्याचा. आधी वेळ काय घेते ते शोधा. नेटवर्क प्रतीक्षा, ऑब्जेक्ट पार्सिंग आणि बल्क अंकगणित वेगवेगळ्या दुरुस्त्यांची मागणी करतात. जेव्हा गणना आणि डेटा योग्य असतील तेव्हा नेटिव्ह ॲरे ऑपरेशन्स मदत करतात. तुमच्या कॉलरला प्रत्यक्षात कोणता परिणाम आवश्यक आहे ते मोजा.

4:43 आता त्या शॉर्टकटसाठी. तुमच्याकडे एक पायथन फंक्शन आहे आणि ते ॲरे स्वीकारू इच्छिते. वेक्टरराइज नावाचा रॅपर गहाळ कार्यक्षमतेचे बटण असल्यासारखे वाटते. त्याच्या दस्तऐवजीकरणामध्ये एक महत्त्वाचे वाक्य वाट पाहत आहे. NumPy म्हणते की त्याचे vectorize रॅपर प्रामुख्याने सोयीसाठी प्रदान केले आहे.

np.vectorize प्रत्यक्षात काय कार्यान्वित करते?

4:56 त्याची अंमलबजावणी मूलतः एक for लूप आहे. रॅपर बॅचेस स्वीकारतो, परंतु लागोपाठ घटकांसाठी तुमचे पायथन फंक्शन कॉल करत राहतो. इंटरफेस लहान झाला. कार्यान्वयन सीमा व्यस्त राहिली. पायथन कॉलबॅकमधून समान मूल्ये परत येताना पहा. रेडी ॲरेसह, या आवृत्तीला सुमारे सत्याऐंशी मिलीसेकंद लागले. ते आमच्या कॉम्प्रिहेन्शनपेक्षा हळू होते. एक उपयुक्त ब्रॉडकास्टिंग रॅपर तुम्ही काढून टाकण्याचा प्रयत्न करत असलेले अचूक प्रति-घटक काम जतन करू शकते.

5:18 बॅच इंटरफेसच्या मागे अंमलबजावणी तपासा, सुसंगत डेटा त्याच्या उपयुक्त स्वरूपात ठेवा आणि तुलनेत रूपांतरण समाविष्ट करा. नेटिव्ह, कॉलबॅक आणि संकलित लूप्स कॉलरच्या दृष्टिकोनातून समान दिसू शकतात. वेक्टरराइज या नावाने केलेले वचन तुमच्या स्टॉपवॉचने कधीही साइन केले नाही. जेव्हा सोयीची गरज असते तेव्हा ते ठेवा. कार्यक्षमतेसाठी, चालू असलेला लूप तपासा. माझा निकाल आहे SHIP IT बॅचिंगसाठी एका मोजलेल्या अंकीय हॉट पाथसाठी. जेव्हा सामान्य लूप्स आधीच चांगले काम करत असतील तेव्हा ते ठेवा.

आपण आपल्या कोडमध्ये काय बदलले पाहिजे?

5:41 काम कुठे होते आणि पुढील कॉलरला काय आवश्यक आहे ते तपासा. सदस्यता घ्या, बेल दाबा आणि तुम्ही ते वेगळ्या पद्धतीने स्टॅम्प केले असते का हे मला कमेंटमध्ये सांगा. आणि आजचा हाच फरक आहे. मी Axrisi चा Niko आहे. जबाबदारीने विलीन करा. मी Axrisi चा Niko आहे. जबाबदारीने विलीन करा.

स्रोत

  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 · mr · ८ ऑक्टो, २०२६

पोलर्स 2.0: जॉइन्स त्यांची पंक्ती क्रमवारी का राखत नाहीत

पोलर्स 2.0 डीफॉल्टनुसार स्ट्रीमिंग इंजिनवर कलेक्ट चालवते. जॉइन, ग्रुप_बाय आणि अनपिव्हटसाठी, हे रिलीज इनपुट पंक्ती क्रमवारीची हमी देत नाही, जोपर्यंत तुम्ही maintain_order सेट करत नाही किंवा स्पष्टपणे स

2:31 ↗
under-the-hood · mr · १२ ऑक्टो, २०२६

हगिंग फेस मॉडेल फाइल्स छुपे कोड चालवू शकतात

दुर्भावनापूर्ण मॉडेल पॅकेजेस असुरक्षित लोडिंग दरम्यान कोड कार्यान्वित करू शकतात. पिकल रिव्हर्स शेल्स, तुटलेल्या-फाइल स्कॅनर वर्तन आणि संशोधनाने-सिद्ध मॉडेल-नावाचा गोंधळ, या तीन दस्तऐवजीकरण केलेल्या उद

3:33 ↗
under-the-hood · mr · ११ ऑक्टो, २०२६

जेव्हा प्रतिसाद अदृश्य होतो तेव्हा Stripe तुमच्या विनंतीची आठवण ठेवते

सर्व्हरने ऑपरेशन पूर्ण केल्यानंतर टाइमआउट चेकआउट अनिश्चित स्थितीत सोडू शकते. हे 'अंडर द हूड' स्पष्टीकरण Stripe API v1 च्या दस्तऐवजीकृत आयडेम्पोटेंसी कराराचा वापर करून स्थिर ऑपरेशन की, सेव्ह केलेल्या प

2:54 ↗
under-the-hood · mr · १० ऑक्टो, २०२६

Shopify ने इन्व्हेंटरी आरक्षण MySQL मध्ये हलवले

Shopify ने आपली इन्व्हेंटरी आरक्षण प्रणाली Redis मधून MySQL डेटाबेसमध्ये हलवली, जिथे इन्व्हेंटरी लेजर आधीच होते. वैयक्तिकरित्या लॉक करता येण्याजोग्या युनिट पंक्तींचा एक बाउंडेड पूल एकाचवेळी चेकआउटला व

2:58 ↗