+− THE DAILY DIFFdev & AI news
SHIP IT

Python өнімділігі: жергілікті NumPy циклдері, кері қоңыраулар және түрлендіру шығындары

Бақыланатын, тек CPU-ға арналған сандық тест бірдей мәндерді CPython циклдері, NumPy арифметикасы, Python кері қоңырау қаптамасы және компиляцияланған Numba циклі арқылы бақылайды.

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

Бақыланатын, тек 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 бұл өтпелерді өлшеңіз. Қымбат тапсырудан бұрын тоқтау қате сұраққа дәл сандар береді. Бұл массивті көбейту уақытша нәтиже жасайды. Бастапқы мәндерді қосу шығыс жасайды. Жергілікті орындау әлі де жадыны қажет етеді және деректерді жылжытады. Кейбір операциялар шығыс буферін қабылдайды, егер сіздің кодыңыз оны қауіпсіз қайта пайдалана алса, бөлулерді азайтады. Бір әдемі жол бірнеше үлкен буферді тапсырыс бере алады.

3:47 Python Speed бұл мәселені де атап өтеді. Бөлуші сіздің эстетикаңызға таңқаларлықтай немқұрайлы. Сіз цикл синтаксисін сақтап, оның орындалуын өзгерте аласыз. Numba қолдау көрсетілетін сандық Python функцияларын жергілікті кодқа компиляциялай алады. Міне, біздің тесттен алынған цикл, оның компилятор декораторымен.

Компиляцияланған Python циклі де жылдам бола алады ма?

4:00 Онда әлі де for деп жазылған. Қымбат интерпретатор жолы өзгерді. Компиляциядан кейін бұл цикл дайын массивтермен жарты миллисекундтан аз уақыт алды. Компиляцияның өзі бұл іске қосуда шамамен бір секундты алды. Бұл орнату шығыны қайталанған уақыт өлшемдерінен алынып тасталды, сондықтан кішкентай бір реттік жұмыс басқа салыстыруға лайық. Numba-ның өз нұсқаулығы анық циклдерді көрсетуге қуанышты. Ыстық жолды таппай тұрып тіл миграциясын бастау - бұл

4:22 профайлерді ашудан аулақ болудың күрделі жолы. Алдымен уақытты не тұтынатынын табыңыз. Желі күтулері, объектілерді талдау және жаппай арифметика әртүрлі түзетулерді қажет етеді. Есептеу мен деректер сәйкес келген кезде жергілікті массив операциялары көмектеседі. Шақырушыға нақты қажет нәтижені өлшеңіз. Енді сол жарлық туралы. Сізде Python функциясы бар және оның массивті қабылдағанын қалайсыз. Vectorize деп аталатын қаптама жоқ өнімділік түймесі сияқты естіледі.

4:43 Оның құжаттамасында маңызды сөйлем күтіп тұр. NumPy оның vectorize қаптамасы ең алдымен ыңғайлылық үшін берілгенін айтады. Оның іске асырылуы негізінен for циклі болып табылады. Қаптама пакеттерді қабылдайды, бірақ келесі элементтер үшін Python функцияңызды шақыра береді. Интерфейс қысқарды. Орындау шекарасы жұмысбасты болып қалды.

np.vectorize іс жүзінде нені орындайды?

4:56 Бірдей мәндердің Python кері қоңырауы арқылы қайта оралуын қараңыз. Дайын массивтермен бұл нұсқа шамамен сексен жеті миллисекундты алды. Ол біздің түсініктен баяуырақ болды. Пайдалы хабар тарату қаптамасы сіз жоюға тырысқан элемент бойынша дәл жұмысты сақтай алады. Пакеттік интерфейстің артындағы іске асыруды тексеріңіз, үйлесімді деректерді пайдалы формада сақтаңыз және салыстыруға түрлендіруді қосыңыз. Жергілікті, кері қоңырау және компиляцияланған циклдер шақырушының орындығынан ұқсас көрінуі мүмкін. Vectorize атауы сіздің секундомеріңіз ешқашан қол қоймаған уәде берді.

5:18 Ыңғайлылық қажет болғанда оны сақтаңыз. Өнімділік үшін жұмыс істеп тұрған циклді тексеріңіз. Менің шешімім - өлшенген сандық ыстық жолды пакеттеу үшін SHIP IT. Кәдімгі циклдер жақсы жұмыс істеп тұрғанда оларды сақтаңыз. Жұмыс қайда болатынын және келесі шақырушыға не қажет екенін тексеріңіз. Жазылыңыз, қоңырау белгісін басыңыз және егер сіз басқаша белгілеген болсаңыз, пікірлерде айтыңыз. Және бүгінгі айырмашылық осы. Мен Axrisi-ден Никомын.

Кодыңызда нені өзгерту керек?

5:41 Жауапкершілікпен біріктіріңіз. Python-ға жылдам болу үшін жаңа тіл қажет деп ойлайсыз. Біздің пакетті бір CPU цикл жылжығаннан кейін жылдамырақ орындады. Жұмыс қайда кетті? Жылдамдық қашан жоғалады? Python-ды қайтару үшін қай жарлық көмектеседі? Бұл The Daily Diff, ішкі жағынан.

Дереккөздер

  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 · kk · 2026 ж. 12 қаз.

Hugging Face үлгі файлдары жасырын кодты іске қоса алады

Зиянды үлгі пакеттері қауіпті жүктеу кезінде кодты іске қоса алады. Үш құжатталған мысал Pickle кері қабықшаларын, бүлінген файл сканерінің әрекетін және зерттеуде көрсетілген үлгі атауларының шатасуы

3:33 ↗
under-the-hood · kk · 2026 ж. 11 қаз.

Stripe жауап жоғалып кеткенде сұранысыңызды есте сақтайды

Таймаут сервер операцияны аяқтағаннан кейін төлемді белгісіз қалдыруы мүмкін. Бұл «Қалқа астында» түсіндірушісі Stripe API v1 құжатталған идемпотенттік келісімшартын пайдаланып, тұрақты операция кілтт

2:54 ↗