Python ishlashi: mahalliy NumPy sikllari, qayta qo'ng'iroqlar va konvertatsiya xarajatlari
Nazorat qilingan faqat CPU-da raqamli test CPython sikllari, NumPy arifmetikasi, Python qayta qo'ng'iroq o'rami va kompilyatsiya qilingan Numba sikli orqali bir xil qiymatlarni kuzatadi.
Nazorat qilingan faqat CPU-da raqamli test CPython sikllari, NumPy arifmetikasi, Python qayta qo'ng'iroq o'rami va kompilyatsiya qilingan Numba sikli orqali bir xil qiymatlarni kuzatadi. Tayyor kiritilgan NumPy katta ustunlikka ega bo'ldi, Python ro'yxatlariga o'tkazish va qayta o'tkazish esa bu ustunlikni deyarli tenglashtirdi. Epizod ijro etish chegarasini va dasturga kerakli natijani qanday o'lchashni tushuntiradi.
Yozma nashrini oʻqing (inglizcha) ↗
Bu video nimani qamrab oladi
- CPython manba kodini bayt-kodga kompilyatsiya qiladi. Takroriy tarjimon/ob'ekt ishi va terilgan mahalliy raqamli sikl turli xil ijro etish tartiblari hisoblanadi.
- Raqamli NumPy arifmetikasi terilgan partiyalarni kompilyatsiya qilingan operatsiyalarga topshirishi mumkin; arifmetik sikl hali ham mavjud va ko'rinishlar uzluksiz bo'lmagan joylashuvlarga ega bo'lishi mumkin.
- Konvertatsiya va talab qilinadigan chiqish tasvirini o'lchang. Ushbu ishda Python ro'yxatlarini massivlarga aylantirish va qayta aylantirish katta tayyor massiv ustunligini yo'q qildi.
- Kichik ish yuklari odatdagi Pythonga foyda keltirishi mumkin, chunki qat'iy massiv-chaqiriq xarajatlari muhim. Sakkiz qiymatli komprehensiya ushbu o'lchangan taqqoslashda g'alaba qozondi.
- np.vectorize ketma-ket elementlar uchun Pythonga murojaat qiluvchi qulaylik o'rami hisoblanadi; faqat partiya interfeysi mahalliy raqamli ijroni o'rnatmaydi.
- Kompilyatsiya qilingan Python sintaksisi sikllari ham tez bo'lishi mumkin. Agar ular chaqiruvchiga muhim bo'lsa, sovuq kompilyatsiya/sozlash xarajatlarini qo'shing.
- Mahalliy ijro, CPU SIMD, ko'p ishlov berish va GPU backendlari alohida g'oyalardir. Mavjud CPU xususiyatlari ma'lum bir ishda ishlatilgan ko'rsatmalarni kuzatmaydi.
Tarjima qilingan transkript
Asl inglizcha hikoyadan tarjima qilingan. Mavjud audio va subtitrlar YouTube tomonidan boshqariladi.
Nima uchun bir xil CPU tezroq tugatishi mumkin?
0:00 Sizningcha, Python tez ishlash uchun yangi tilga muhtoj. Bir xil CPU sikl ko'chirilgandan so'ng bizning partiyani tezroq ishga tushirdi. Ish qayerga ketdi? Tezlik qachon yo'qoladi? Qaysi yorliq Pythonga qaytaradi? Bu The Daily Diff, ichki tomondan. Bu yorliqni kuzatib boring. CPython standart Python dasturi hisoblanadi.
0:17 U manba kodingizni bayt-kodga kompilyatsiya qiladi, so'ngra bu ko'rsatmalarni tarjimonda ishga tushiradi. NumPy - bu e'lon qilingan ma'lumotlar turiga ega qiymatlarni saqlovchi massivlarga ega raqamli kutubxona. Uning o'rnatilgan arifmetikasi butun partiyani kompilyatsiya qilingan operatsiyalarga topshirishi mumkin. Bir million float qiymatlarni oling, har birini kvadratga ko'taring, so'ngra asl qiymatni qo'shing. Har bir versiya bir xil qiymatlarni oladi va mos keladigan javoblarni beradi. Qiymatlar yumaloq farqlarni poygadan tashqarida saqlash uchun etarlicha kichik. Bu mashinada komprehensiya o'ttiz uch millisekund atrofida vaqt oldi.
0:40 NumPy bir millisekunddan kam vaqt oldi. Ikkalasi ham CPUda ishladi. Bu ish yuki uchun foydali dalil va dasturlash tili uchun dahshatli nekrolog. Oddiy sikldan boshlang. Python keyingi qiymatni oladi, arifmetikani bajaradi va javobni qo'shadi. Keyin u buni yana takrorlaydi.
Python sikli qanday ishni takrorlaydi?
0:53 Ko'paytirish arzon. Keyingi ko'paytirishni tashkil qilish va uning atrofidagi Python ob'ektlarini boshqarish har safar ish qo'shadi. Bu sinovdan o'tgan funksiyaning asl disassemblidir. Takrorlash, ko'paytirish va qo'shish bayt-kod ko'rsatmalari sifatida paydo bo'ladi. Python versiyalari va tarjimonlar turli xil tanlovlar qiladi. Bu vaqtlar ekranda ko'rsatilgan versiyaga tegishli, bu Python o'n. Python ro'yxati ob'ektlarga havolalarni saqlaydi, shuning uchun turli xil narsalar ro'yxatni baham ko'rishi mumkin. Bizning arifmetik ishimiz doimiy ravishda raqamlardan foydalanadi.
1:14 U takroriy xizmatni so'rab, umumiy tartibga pul to'laydi. Bir million marta bir xil kofeni buyurtma qilishni va har bir chashka uchun yangi shaklni to'ldirishni tasavvur qiling. Kofe mashinasi yaxshi. Hujjat ishi o'z karerasini rivojlantirdi. NumPy shartnomani o'zgartiradi. Bu massiv bir e'lon qilingan turga ega bo'lgan qat'iy o'lchamli float qiymatlarni saqlaydi. Bizning massivimiz uzluksiz, shuning uchun uning qiymatlari xotirada birga joylashgan. Ko'rinishlar boshqa joylashuvlarga ega bo'lishi mumkin.
1:36 Arifmetik operatsiya qanday ma'lumotlarni qabul qilayotganini biladi.
NumPy siklni qayerga o'tkazadi?
1:38 Chaqiriq partiyani mahalliy operatsiyaga topshiradi. Sikl hali ham kompilyatsiya qilingan kod ichidagi qiymatlarni ziyorat qiladi. U bu ish bo'yicha tur haqidagi bilimlarni qayta ishlatishi mumkin. Python ishni topshiruvchi shaxs bo'lib qoladi. Itamar Turner Trauring bu farqni Python Speedda tushuntiradi. Partiya interfeyslari, mahalliy implementatsiyalar va protsessor vektor ko'rsatmalari alohida narsalardir. Funksiya nomi juda kam dalil beradi. Bu natija CPUda NumPy dan foydalangan. CuPy kabi GPU backend massivlar va operatsiyalar uchun boshqa joyni tanlaydi.
2:00 GPU sotib olish bu oddiy Python siklini allaqachon ishlagan joyda ishga tushiradi. CPU vektor ko'rsatmalari bir nechta qiymatlarni birga qayta ishlashi mumkin. NumPy qo'llab-quvvatlanadigan kernellarni tanlash mexanizmiga ega. Bizning ish vaqtimiz mavjud xususiyatlarni xabar qiladi, ammo bu ifodaning ko'rsatmalarini kuzatmaydi. Butun o'lchangan yutuqni vektor ko'rsatmalariga berish dalillarni haddan tashqari oshirib yuborish bo'ladi.
Tez degani GPUmi yoki ko'p CPU yadrosi?
2:13 GPU savat yopiq qolishi mumkin. Sotib olishni ham bekor qiluvchi ishlashni tuzatishda juda qoniqarli narsa bor. Afsuski, benchmark davom etadi. Sakkiz qiymat bilan komprehensiya g'alaba qozondi. Massiv mexanizmini chaqirish kichik ishdan ko'ra ko'proq xarajat qildi. Kattaroq tayyor massivlar oldinga o'tdi. Biz takroriy sinovlar va qizdirilgan jarayondan foydalandik. Yangi Python versiyalari kesishish nuqtasini o'zgartirishi mumkin. Keyin dasturga nima kerakligini o'zgartiring.
2:40 Python ro'yxatidan boshlang va yangi Python ro'yxati bilan tugating. NumPy kiritishni massivga aylantirishi va javobni qayta Python ob'ektlariga aylantirishi kerak. Agar dasturingiz ularga muhtoj bo'lsa, bu qadamlar hisobga kiradi. Bir million qiymatda, bu to'liq yo'l yigirma sakkiz millisekund atrofida vaqt oldi.
Ta'sirchan tezlik qachon yo'qoladi?
2:49 Komprehensiya ham yigirma sakkiz atrofida vaqt oldi. Bizning dramatik ustunligimiz deyarli tenglashdi. Tez qism haqiqiy edi. Afzallik ma'lumotlarning raqamli shaklda qolishiga bog'liq edi. Ma'lumotlarga ergashing. Agar keyingi operatsiya massivni qabul qilsa, massivni saqlang. Agar siz ro'yxatlar va massivlar o'rtasida takroriy konvertatsiya qilsangiz, bu kesishmalarni o'lchang.
3:11 Qimmat topshirishdan oldin to'xtash noto'g'ri savol uchun aniq raqamlarni beradi. Bu massivni ko'paytirish vaqtinchalik natijani yaratadi. Asl qiymatlarni qo'shish chiqishni yaratadi. Mahalliy ijro hali ham xotiraga muhtoj va ma'lumotlarni ko'chiradi. Ba'zi operatsiyalar chiqish buferini qabul qiladi, bu sizning kodingiz uni xavfsiz qayta ishlatishi mumkin bo'lganda ajratishlarni kamaytiradi. Bitta chiroyli qator bir nechta katta buferlarni buyurtma qilishi mumkin. Python Speed bu muammoni ham chaqiradi.
Qaysi chegaralar benchmarkga tegishli?
3:28 Ajratuvchi sizning estetikangizga juda befarq. Siz sikl sintaksisini ham saqlab qolishingiz va uning ijrosini o'zgartirishingiz mumkin. Numba qo'llab-quvvatlanadigan raqamli Python funksiyalarini mahalliy kodga kompilyatsiya qilishi mumkin. Mana bizning testimizdagi sikl uning kompilyator dekoratori bilan. U hali ham for deydi. Qimmat tarjimon yo'li o'zgardi. Kompilyatsiyadan so'ng, bu sikl tayyor massivlar bilan yarim millisekunddan kamroq vaqt oldi. Kompilyatsiya o'zi bu ishda bir soniya atrofida vaqt oldi. Bu sozlash xarajati takroriy vaqtlardan chiqarib tashlandi,
3:47 shuning uchun kichik bir martalik ish boshqa taqqoslashga loyiq. Numbaning o'z qo'llanmasi aniq sikllarni ko'rsatishdan mamnun. Issiq yo'lni topmasdan turib til migratsiyasini boshlash profiler ochmaslikning murakkab yo'li. Avval nimani vaqt sarflashini toping.
Kompilyatsiya qilingan Python sikli ham tez bo'lishi mumkinmi?
4:00 Tarmoq kutishlari, ob'ektni ajratish va ommaviy arifmetika turli xil tuzatishlarni talab qiladi. Mahalliy massiv operatsiyalari hisoblash va ma'lumotlar mos kelganda yordam beradi. Chaqiruvchingizga aslida kerak bo'lgan natijani o'lchang. Endi o'sha yorliq uchun. Sizda Python funksiyasi bor va u massivni qabul qilishini xohlaysiz. Vectorize nomli o'ram yo'qolgan ishlash tugmasi kabi eshitiladi. Uning hujjatlarida muhim jumla kutib turibdi. NumPy vectorize o'rami asosan qulaylik uchun taqdim etilganini aytadi.
4:22 Uning implementatsiyasi asosan for sikli. O'ram partiyalarni qabul qiladi, lekin ketma-ket elementlar uchun Python funksiyangizni chaqirishni davom ettiradi. Interfeys qisqardi. Ijro etish chegarasi band bo'lib qoldi. Bir xil qiymatlarning Python qayta qo'ng'irog'i orqali qaytib kelishini kuzating. Tayyor massivlar bilan bu versiya sakson etti millisekund atrofida vaqt oldi. U bizning komprehensiyamizdan sekinroq edi. Foydali translyatsiya o'rami siz olib tashlashga urinayotgan aniq elementga oid ishni saqlab qolishi mumkin. Partiya interfeysi ortidagi implementatsiyani tekshiring, mos ma'lumotlarni foydali shaklda saqlang va konvertatsiyani taqqoslashga qo'shing.
4:43 Chaqiruvchining o'rindig'idan mahalliy, qayta qo'ng'iroq va kompilyatsiya qilingan sikllar bir xil ko'rinishi mumkin. Vectorize nomi sekundomeringiz hech qachon imzolamagan va'dani berdi. Agar sizga qulaylik kerak bo'lsa, uni saqlab qoling. Ishlash uchun ishlaydigan siklni tekshiring. Mening hukmim o'lchangan raqamli issiq yo'lni partiyalash uchun SHIP IT.
np.vectorize aslida nimani bajaradi?
4:56 Oddiy sikllarni ular allaqachon yaxshi ishlayotganda saqlab qoling. Ish qayerda sodir bo'lishini va keyingi chaqiruvchiga nima kerakligini tekshiring. Obuna bo'ling, qo'ng'iroqni bosing va agar siz uni boshqacha shtamplagan bo'lsangiz, izohlarda ayting. Va bugungi farq shu. Men Axrisidan Nikoman. Mas'uliyat bilan birlashtiring. Sizning Python funksiyangiz massiv qabul qilishini xohlaysiz. Vectorize deb nomlangan oʻram yoʻqolgan ishlash tugmasi kabi koʻrinadi.
5:18 Uning hujjatlarida muhim gap bor. NumPy vectorize oʻrami asosan qulaylik uchun taqdim etilganini aytadi. Uning implementatsiyasi asosan for sikli. Oʻram partiyalarni qabul qiladi, lekin keyingi elementlar uchun Python funksiyangizni chaqirishni davom ettiradi. Interfeys qisqardi. Ijro etish chegarasi band boʻlib qoldi. Bir xil qiymatlarning Python qayta qoʻngʻirogʻi orqali qaytib kelishini kuzating. Tayyor massivlar bilan bu versiya sakson etti millisekund atrofida vaqt oldi. U bizning komprehensiyamizdan sekinroq edi.
Kodingizda nimani o'zgartirishingiz kerak?
5:41 Foydali translyatsiya oʻrami siz olib tashlashga urinayotgan aniq elementga oid ishni saqlab qolishi mumkin. Partiya interfeysi ortidagi implementatsiyani tekshiring, mos maʼlumotlarni foydali shaklda saqlang va konvertatsiyani taqqoslashga qoʻshing. Mahalliy, qayta qoʻngʻiroq va kompilyatsiya qilingan sikllar chaqiruvchining oʻrindigʻidan bir xil koʻrinishi mumkin. Vectorize nomi sekundomeringiz hech qachon imzolamagan vaʼdani berdi. Agar sizga qulaylik kerak boʻlsa, uni saqlab qoling. Ishlash uchun ishlaydigan siklni tekshiring. Mening hukmim oʻlchangan raqamli issiq yoʻlni partiyalash uchun SHIP IT.
Manbalar
- 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



