Python аткаруусу: нативдүү NumPy циклдери, кайра чалуулар жана конверсия чыгымдары
Башкарылуучу CPU-гана сандык тест CPython циклдери, NumPy арифметикасы, Python кайра чалуу оромосу жана компиляцияланган Numba цикли аркылуу бирдей маанилерди байкайт.
Башкарылуучу CPU-гана сандык тест CPython циклдери, NumPy арифметикасы, Python кайра чалуу оромосу жана компиляцияланган Numba цикли аркылуу бирдей маанилерди байкайт. Даяр-киргизүү NumPy чоң артыкчылыкка ээ болгон, ал эми Python тизмелеринен конверсия жана кайра конверсия бул артыкчылыкты дээрлик теңдештирген. Эпизод аткаруу чектерин жана тиркемеге керектүү натыйжаны кантип өлчөө керектигин түшүндүрөт.
Жазма басылышын окуу (Англисче) ↗
Бул видео эмнелерди камтыйт
- CPython булакты байт-кодго компиляциялайт. Кайталануучу интерпретатор/объект иши жана терилген нативдүү сандык цикл ар кандай аткаруу түзүлүштөрү.
- Сандык NumPy арифметикасы компиляцияланган операцияларга терилген партияларды бере алат; арифметикалык цикл дагы эле бар, жана көрүнүштөр үзгүлтүксүз эмес жайгашууларга ээ болушу мүмкүн.
- Конверсияны жана талап кылынган чыгаруунун өкүлчүлүгүн өлчөө. Бул чуркоодо, Python тизмелерин массивдерге айландыруу жана кайра кайтаруу чоң даяр массивдин артыкчылыгын жок кылды.
- Кичинекей жумуш жүгү кадимки Pythonду колдоого алат, анткени туруктуу массив-чакыруу чыгымдары маанилүү. Сегиз маанини түшүнүү бул өлчөнгөн салыштырууда жеңишке жетти.
- np.vectorize - бул кийинки элементтер үчүн Pythonду чакырган ыңгайлуу оромо; бир гана пакет интерфейси нативдүү сандык аткарууну орнотпойт.
- Компиляцияланган Python-синтаксис циклдери дагы тез болушу мүмкүн. Чакыруучуга маанилүү болгондо муздак компиляция/орнотуу чыгымдарын кошуу.
- Нативдүү аткаруу, CPU SIMD, көп жиптүүлүк жана GPU бэкэнддери өзүнчө идеялар. Жеткиликтүү CPU функциялары белгилүү бир чуркоодо колдонулган нускамаларды издебейт.
Котормо стенограмма
Англис тилиндеги баштапкы баяндамадан которулган. Жеткиликтүү аудио жана коштомо жазуулар YouTube тарабынан көзөмөлдөнөт.
Эмне үчүн бир эле CPU тезирээк бүтө алат?
0:00 Сиз Python тез болушу үчүн жаңы тил керек деп ойлойсуз. Цикл жылгандан кийин ошол эле CPU биздин партияны тезирээк иштетти. Жумуш кайда кетти? Ылдамдануу качан жоголот? Кайсы жарлык Pythonду кайра алып келет? Бул The Daily Diff, ичинен. Ошол жарлыкты байкап туруңуз. CPython - бул стандарттуу Python ишке ашыруу.
0:17 Ал сиздин булагыңызды байт-кодго компиляциялайт, андан кийин ал нускамаларды интерпретатордо иштетет. NumPy - бул массивдери жарыяланган маалымат түрү менен маанилерди кармаган сандык китепкана. Анын орнотулган арифметикасы бүт партияны компиляцияланган операцияларга бере алат. Бир миллион флоат чекиттүү маанини алыңыз, ар бирин квадраттаңыз, андан кийин баштапкы маанини кошуңуз. Ар бир версия бирдей маанилерди алат жана дал келген жоопторду берет. Маанилер тегеректөө айырмачылыктарын жарыштан тышкары кармап туруу үчүн жетиштүү кичинекей. Бул машинада түшүнүк отуз үч миллисекундага жакын убакытты алды.
0:40 NumPy бир миллисекундадан аз убакытты алды. Экөө тең CPUда иштеди. Бул жумуш жүгү үчүн пайдалуу далил, жана программалоо тили үчүн коркунучтуу некролог. Кадимки циклден баштаңыз. Python кийинки маанини алат, арифметиканы аткарат жана жоопту кошот. Андан кийин аны кайра аткарат.
Python цикли кайсы ишти кайталайт?
0:53 Көбөйтүү арзан. Кийинки көбөйтүүнү уюштуруу жана анын айланасындагы Python объекттерин башкаруу, ар бир жолу ишти кошот. Бул сыналган функциянын чыныгы дисассемблери. Итерация, көбөйтүү жана кошуу байт-код нускамалары катары пайда болот. Python версиялары жана интерпретаторлору ар кандай тандоолорду жасашат. Бул убакыттар экрандагы версияга таандык, бул Python үч ондук. Python тизмеси объекттерге шилтемелерди сактайт, ошондуктан ар кандай нерселер
1:14 бир тизмени бөлүшө алат. Биздин арифметикалык иш бардык жерде сандарды колдонот. Ал кайталануучу кызматты сурап жатканда жалпы түзүлүш үчүн төлөйт. Бир миллион жолу бир эле кофеге заказ берип, ар бир чыны үчүн жаңы форма толтуруп жатканыңызды элестетиңиз. Кофе машинасы жакшы. Кагаз иштери өзүнүн карьерасын өнүктүргөн. NumPy келишимди өзгөртөт. Бул массив бир жарыяланган түрү менен туруктуу өлчөмдөгү флоат чекиттүү маанилерди кармайт.
1:36 Биздин массив үзгүлтүксүз, ошондуктан анын маанилери эс тутумда чогуу жайгашкан.
NumPy циклди кайда жылдырат?
1:38 Көрүнүштөр башка жайгашууларга ээ болушу мүмкүн. Арифметикалык операция алган маалыматтын түрүн билет. Чакыруу партияны нативдүү операцияга берет. Цикл дагы эле компиляцияланган коддун ичиндеги маанилерди кыдырат. Ал ошол иш боюнча типтин билимин кайра колдоно алат. Python ишти өткөрүп берген адам бойдон кала берет. Итамар Тёрнер Трауринг Python Speedде айырманы түшүндүрөт. Пакеттик интерфейстер, нативдүү ишке ашыруулар жана процессордун вектордук нускамалары
2:00 өзүнчө нерселер. Функциянын аталышы өтө аз далилдерди берет. Бул натыйжа CPUда NumPyди колдонгон. CuPy сыяктуу GPU бэкэнди массивдер жана операциялар үчүн башка жерди тандайт. GPU сатып алуу бул кадимки Python циклин ал иштеген жерде иштетүүнү калтырат.
Тез деген GPU же көп CPU өзөктөрүбү?
2:13 CPU вектордук нускамалары бир нече маанилерди чогуу иштете алат. NumPy колдоого алынган ядролорду тандоо үчүн механизми бар. Биздин иштөө убактыбыз жеткиликтүү функцияларды билдирет, бирок бул туюнтманын нускамаларын издебейт. Вектордук нускамаларга өлчөнгөн толук пайданы берүү далилдерди ашыкча сатат. GPU соода арабасы жабык бойдон кала алат. Аткарууну оңдоо менен бирге сатып алууну жокко чыгарууда терең канааттануу бар. Тилекке каршы, бенчмарк уланууда.
2:40 Сегиз маани менен түшүнүк жеңишке жетти. Массив механизмдерин чакыруу кичинекей жумушка караганда көбүрөөк чыгым келтирди. Чоңураак даяр массивдер алдыга чыкты.
Таасирдүү ылдамдануу качан жоголот?
2:49 Биз кайталануучу сыноолорду жана ысытылган процессти колдондук. Жаңы Python курулуштары кайчылашууну өзгөртө алат. Андан кийин тиркемеге эмне керек экенин өзгөртүңүз. Python тизмеси менен баштап, жаңы Python тизмеси менен бүтүрүңүз. NumPy киргизүүнү массивге айландырып, жоопту кайра Python объекттерине айландырышы керек. Эгер сиздин тиркемеңизге алар керек болсо, бул кадамдар эсепке кирет. Бир миллион мааниде, бул толук жол жыйырма сегиз миллисекундага жакын убакытты алды. Түшүнүк да жыйырма сегиз миллисекундага жакын убакытты алды.
3:11 Биздин драмалык артыкчылык дээрлик теңдешип калды. Тез бөлүк чыныгы болчу. Артыкчылык маалыматты өзүнүн сандык формасында калтырууга байланыштуу болчу. Маалыматты ээрчиңиз. Эгер кийинки операция массивди кабыл алса, массивди сактаңыз. Эгер сиз тизмелер менен массивдердин ортосунда кайра-кайра конверсия кылсаңыз,
Бенчмаркта кайсы чектер болушу керек?
3:28 ал өтүүлөрдү өлчөө. Кымбат баалуу өткөрүп берүүдөн мурун токтотуу туура эмес суроо үчүн так сандарды берет. Бул массивди көбөйтүү убактылуу натыйжаны түзөт. Баштапкы маанилерди кошуу чыгарууну түзөт. Нативдүү аткаруу дагы эле эс тутумду талап кылат жана маалыматтарды жылдырат. Кээ бир операциялар чыгаруу буферин кабыл алат, эгер сиздин кодуңуз аны коопсуз кайра колдоно алса, бөлүүлөрдү азайтат. Бир сулуу сап бир нече чоң буферлерге заказ бере алат. Python Speed да бул көйгөйдү айтат.
3:47 Бөлүүчү сиздин эстетикаңызга укмуштуудай кайдыгер. Сиз ошондой эле цикл синтаксисин сактап, анын аткарылышын өзгөртө аласыз. Numba колдоого алынган сандык Python функцияларын нативдүү кодго компиляциялай алат. Бул жерде биздин тесттен алынган цикл, анын компилятор декоратору менен. Ал дагы эле "үчүн" деп айтылат.
Компиляцияланган Python цикли да тез боло алабы?
4:00 Кымбат интерпретатор жолу өзгөрдү. Компиляциядан кийин, бул цикл даяр массивдер менен жарым миллисекундадан аз убакытты алды. Компиляциянын өзү бул иште бир секундага жакын убакытты алды. Бул орнотуу чыгымы кайталануучу убакыттардан алынып салынган, ошондуктан кичинекей бир жолку жумуш башка салыштырууга татыктуу. Numbaнын өзүнүн көрсөтмөсү ачык циклдерди көрсөтүүгө кубанычта. Ысык жолду таппай туруп, тил миграциясын баштоо профилдерди ачуудан качуунун татаал жолу.
4:22 Биринчиден, убакытты эмне керектей турганын табыңыз. Тармак күтүүлөрү, объектти талдоо жана жапырт арифметика ар кандай оңдоолорду талап кылат. Нативдүү массив операциялары эсептөө жана маалыматтар туура келгенде жардам берет. Чакыруучуга чындыгында керектүү натыйжаны өлчөө. Эми ошол жарлык үчүн. Сизде Python функциясы бар жана анын массивди кабыл алышын каалайсыз. Vectorize деп аталган оромо жоголгон аткаруу баскычына окшош. Анын документациясында маанилүү сүйлөм күтүп турат.
4:43 NumPy анын vectorize оромосу биринчи кезекте ыңгайлуулук үчүн берилген дейт. Анын ишке ашырылышы негизинен "үчүн" циклин түзөт. Оромо партияларды кабыл алат, бирок кийинки элементтер үчүн Python функцияңызды чакырууну улантат. Интерфейс кыскарды. Аткаруу чеги бош эмес бойдон калды.
np.vectorize чындыгында эмнени аткарат?
4:56 Ошол эле маанилердин Python кайра чалуусу аркылуу кайтып келгенин көрүңүз. Даяр массивдер менен бул версия сексен жети миллисекундага жакын убакытты алды. Ал биздин түшүнүккө караганда жайыраак болчу. Пайдалуу таратуу оромосу сиз алып салууга аракет кылган элемент боюнча так ишти сактап кала алат. Пакеттик интерфейстин артындагы ишке ашырууну текшериңиз, шайкеш маалыматтарды пайдалуу формада сактаңыз жана салыштырууга конверсияны кошуңуз. Чакыруучунун ордунан нативдүү, кайра чалуу жана компиляцияланган циклдер окшош көрүнүшү мүмкүн. Vectorize деген аталыш сиздин секундомер эч качан кол койбогон убаданы берген. Ыңгайлуулук керек болгондо аны сактаңыз.
5:18 Аткаруу үчүн, иштеген циклди текшериңиз. Менин өкүмүм - өлчөнгөн сандык ысык жолду пакеттөө үчүн SHIP IT. Кадимки циклдер жакшы иштеп жатканда аларды сактаңыз. Иш кайда болуп жатканын жана кийинки чакыруучуга эмне керек экенин текшериңиз. Жазылыңыз, коңгуроону басыңыз жана эгер сиз башкача мөөр бассаңыз, комментарийлерде айтыңыз. Бүгүнкү айырма ушул. Мен Axrisiден Нико. Жоопкерчиликтүү түрдө бириктириңиз.
Кодуңузда эмнени өзгөртүшүңүз керек?
5:41 My verdict is SHIP IT for batching a measured numerical hot path. Keep ordinary loops when they already work well. Check where the work happens and what the next caller needs. Subscribe, hit the bell, and tell me in the comments if you'd have stamped it differently. And that's the diff for today. I'm Niko from Axrisi. Merge responsibly.
Булактар
- 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



