+− THE DAILY DIFFdev & AI news
SHIP IT

Перформанси на Python: природни NumPy јамки, повратен повик и трошоци за конверзија

Контролиран нумерички тест само за процесорот следи идентични вредности преку CPython јамки, NumPy аритметика, обвивка за повратен повик на Python и компајлирана Numba јамка.

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

Контролиран нумерички тест само за процесорот следи идентични вредности преку CPython јамки, NumPy аритметика, обвивка за повратен повик на Python и компајлирана Numba јамка. Подготвениот влез NumPy имаше голема предност, додека конверзијата од и назад во Python листи ја намали таа предност на речиси изедначен резултат. Епизодата ја објаснува границата на извршување и како да се измери резултатот што му е потребен на апликацијата.

Прочитајте го пишаното издание (англиски) ↗

Што покрива ова видео

  • CPython го компајлира изворот во бајткод. Повторената работа на интерпретер/објект и нативна нумеричка јамка со типови се различни аранжмани за извршување.
  • Нумеричката NumPy аритметика може да предаде типизирани серии на компајлирани операции; аритметичката јамка сè уште постои, а погледите може да имаат неконтинуирани распореди.
  • Измерете ги трошоците за конверзија и потребната излезна репрезентација. Во ова извршување, претворањето на Python листите во низи и обратно ја избриша големата предност на подготвената низа.
  • Малите работни оптоварувања може да го фаворизираат обичниот Python бидејќи фиксните трошоци за повици на низи се важни. Осум-вредносното разбирање победи во ова измерено споредба.
  • np.vectorize е обвивка за погодност која го повикува Python за последователни елементи; само интерфејсот за серии не воспоставува нативно нумеричко извршување.
  • Компајлираните јамки со Python синтакса исто така можат да бидат брзи. Вклучете ги трошоците за ладно компајлирање/поставување кога тие се важни за повикувачот.
  • Нативното извршување, CPU SIMD, мултинишките и графичките бекенди се посебни идеи. Достапните карактеристики на процесорот не ги следат инструкциите што се користат во одредено извршување.

Преведен транскрипт

Преведено од оригиналната англиска нарација. Достапното аудио и наслови се контролирани од YouTube.

Зошто истиот процесор може да заврши порано?

0:00 Мислите дека на Python му треба нов јазик за да стане брз. Истиот процесор ја изврши нашата серија побрзо откако јамката се премести. Каде отиде работата? Кога исчезнува забрзувањето? Која кратенка го враќа Python? Ова е The Daily Diff, зад сцената. Внимавајте на таа кратенка. CPython е стандардната имплементација на Python.

0:17 Го компајлира вашиот извор во бајткод, а потоа ги извршува тие инструкции во интерпретер. NumPy е нумеричка библиотека чии низи содржат вредности со деклариран тип на податоци. Неговата вградена аритметика може да предаде цела серија на компајлирани операции. Земете милион вредности со децимални точки, квадрирајте ја секоја, потоа додадете ја оригиналната вредност. Секоја верзија добива идентични вредности и произведува совпаѓачки одговори. Вредностите се доволно мали за да ги задржат разликите во заокружувањето надвор од трката.

0:40 На оваа машина, разбирањето траеше околу триесет и три милисекунди. NumPy траеше помалку од една. И двете работеа на процесорот. Тоа е корисен доказ за ова оптоварување и ужасна некролог за програмски јазик. Започнете со обичната јамка.

Каква работа повторува Python јамката?

0:53 Python ја добива следната вредност, ја извршува аритметиката и го додава одговорот. Потоа го прави тоа повторно. Множењето е евтино. Организирањето на следното множење и ракувањето со Python објектите околу него, додава работа секој пат. Ова е вистинското расклопување на тестираната функција. Итерацијата, множењето и собирањето се појавуваат како бајткод инструкции. Верзиите и интерпретерите на Python прават различни избори.

1:14 Овие времиња припаѓаат на верзијата на екранот, што е Python три точка десет. Python листата складира референци за објекти, така што различни видови на работи можат да споделат листа. Нашето аритметичко работење користи броеви насекаде. Плаќа за општ аранжман додека бара повторлива услуга. Замислете да нарачате исто кафе милион пати и да пополнувате нов формулар за секоја шолја. Машината за кафе е добра.

1:36 Документацијата разви сопствена кариера.

Каде NumPy ја преместува јамката?

1:38 NumPy го менува договорот. Оваа низа содржи вредности со подвижна запирка со фиксна големина со еден деклариран тип. Нашата низа е континуирана, така што нејзините вредности седат заедно во меморијата. Погледите може да имаат други распореди. Аритметичката операција знае каков вид на податоци добива. Повикот ја предава серијата на нативна операција. Јамка сè уште ги посетува вредностите во компајлираниот код. Може да го искористи знаењето за типот низ таа работа.

2:00 Python останува лицето кое ја предава работата. Итамар Тарнер Трауринг ја објаснува разликата во Python Speed. Интерфејси за серии, нативни имплементации и векторски инструкции на процесорот се посебни работи. Името на функцијата дава многу малку докази.

Дали брзо значи графички процесор или многу процесорски јадра?

2:13 Овој резултат го користеше NumPy на процесорот. Бекенд на графичкиот процесор како CuPy избира друг дом за низи и операции. Купувањето графички процесор ја остава оваа обична Python јамка да работи таму каде што веќе работеше. Векторските инструкции на процесорот можат да обработат неколку вредности заедно. NumPy има механизам за избор на поддржани јадра. Нашето извршување пријавува достапни функции, но не ги следи инструкциите на овој израз. Давањето на целата измерена добивка на векторски инструкции би ги преувеличило доказите.

2:40 Количката за купување графички процесори може да остане затворена. Има нешто длабоко задоволувачко во поправка на перформансите што исто така ја откажува набавката. За жал, бенчмаркот продолжува.

Кога импресивното забрзување исчезнува?

2:49 Со осум вредности, разбирањето победи. Повикувањето на механизмот на низи чинеше повеќе од малата задача. Поголемите подготвени низи излегоа напред. Користевме повторени обиди и загреан процес. Поновите верзии на Python можат да ја променат точката на пресек. Потоа променете што му треба на апликацијата. Започнете со Python листа и завршете со свежа Python листа. NumPy мора да го претвори влезот во низа и да го претвори одговорот назад во Python

3:11 објекти. Тие чекори припаѓаат на сметката ако вашата апликација ги бара. На милион вредности, таа целосна патека траеше околу дваесет и осум милисекунди. Разбирањето траеше околу дваесет и осум исто така. Нашето драматично водство стана речиси изедначено. Брзиот дел беше реален. Предноста зависеше од тоа податоците да останат во нивната нумеричка форма.

Кои граници припаѓаат во бенчмаркот?

3:28 Следете ги податоците. Ако следната операција прифаќа низа, задржете ја низата. Ако постојано конвертирате помеѓу листи и низи, измерете ги тие премини. Запирањето пред скапо предавање дава точни бројки за погрешното прашање. Множењето на оваа низа создава привремен резултат. Додавањето на оригиналните вредности го создава излезот. Нативното извршување сè уште бара меморија и преместува податоци.

3:47 Некои операции прифаќаат излезен бафер, намалувајќи ги алокациите кога вашиот код може безбедно да го користи. Една убава линија може да нарача неколку големи бафери. Python Speed го истакнува и овој проблем. Алокаторот е неверојатно рамнодушен кон вашата естетика.

Може ли и компајлирана Python јамка да биде брза?

4:00 Можете исто така да ја задржите синтаксата на јамката и да го промените нејзиното извршување. Numba може да компајлира поддржани нумерички Python функции во нативен код. Еве ја јамката од нашиот тест со нејзиниот компајлерски декоратор. Сè уште пишува за. Скапата патека на интерпретерот е променета. По компајлирањето, оваа јамка траеше помалку од половина милисекунда со подготвени низи. Самото компајлирање траеше околу една секунда во ова извршување. Тој трошок за поставување беше исклучен од повторените мерења,

4:22 така што ситна еднократна работа заслужува различна споредба. Самиот водич на Numba е среќен да покаже експлицитни јамки. Започнување на миграција на јазик пред да се најде жешката патека е сложен начин да се избегне отворање на профилер. Прво пронајдете што го троши времето. Мрежните чекања, парсирањето на објекти и аритметиката на големи количини бараат различни поправки. Нативните операции со низи помагаат кога пресметката и податоците одговараат.

4:43 Измерете го резултатот што вашиот повикувач навистина го бара. Сега за таа кратенка. Имате Python функција и сакате таа да прифати низа. Обвивката наречена vectorize звучи како копчето за перформанси што недостасува. Нејзината документација има важна реченица што чека.

Што всушност извршува np.vectorize?

4:56 NumPy вели дека неговата обвивка vectorize е обезбедена првенствено за погодност. Нејзината имплементација е суштински for јамка. Обвивката прифаќа серии, но продолжува да ја повикува вашата Python функција за последователни елементи. Интерфејсот стана пократок. Границата на извршување остана зафатена. Гледајте како истите вредности се враќаат преку Python повратен повик. Со подготвени низи, оваа верзија траеше околу осумдесет и седум милисекунди. Беше побавно од нашето разбирање.

5:18 Корисна обвивка за емитување може да ја зачува точната работа по елемент што се обидувавте да ја отстраните. Проверете ја имплементацијата зад интерфејсот за серии, чувајте компатибилни податоци во нивната корисна форма и вклучете ја конверзијата во споредбата. Нативните, повратен повик и компајлираните јамки може да изгледаат слично од гледна точка на повикувачот. Името vectorize даде ветување што вашиот стопер не го потпиша. Задржете го кога ви треба погодност. За перформанси, проверете ја јамката што работи.

Што треба да промените во вашиот код?

5:41 Мојата пресуда е SHIP IT за сериска обработка на измерена нумеричка жешка патека. Задржете ги обичните јамки кога тие веќе работат добро. Проверете каде се случува работата и што му треба на следниот повикувач. Претплатете се, притиснете го ѕвончето и кажете ми во коментарите дали би го означиле поинаку. И тоа е разликата за денес. Јас сум Нико од Axrisi. Спојувајте одговорно.

Извори

  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 · mk · 8 окт. 2026 г.

Polars 2.0: зошто спојувањата повеќе не го задржуваат редоследот на редовите

Polars 2.0 стандардно работи колекција на стриминг машина. За спојување, group_by и unpivot, изданието повеќе не го гарантира редоследот на влезните редови, освен ако експлицитно не поставите maintain

2:31 ↗
under-the-hood · mk · 12 окт. 2026 г.

Моделските датотеки на Hugging Face можат да извршат скриен код

Злонамерните моделски пакети можат да извршат код за време на небезбедно вчитување. Три документирани примери објаснуваат Pickle reverse shells, однесување на скенер за оштетени датотеки и истражување

3:33 ↗