Programavimas

Kas yra PyPy? Greitesnis „Python“ be skausmo

„Python“ užsitarnavo galingumo, lankstumo ir su juo lengva dirbti reputaciją. Šios dorybės paskatino ją naudoti didžiulėje ir vis didesnėje programų, darbo eigų ir laukų įvairovėje. Tačiau kalbos dizainas - jos aiškinamas pobūdis, jos vykdymo dinamika - reiškia, kad „Python“ visada buvo didesne tvarka lėtesnė nei mašinoje vartojamos kalbos, tokios kaip C arba C ++.

Per daugelį metų kūrėjai pateikė įvairių būdų, kaip pritaikyti „Python“ greičio apribojimus. Pavyzdžiui, galite parašyti daug našumo reikalaujančias užduotis C ir apvynioti „Python“; daugelis mašininio mokymosi bibliotekų daro būtent tai. Arba galite naudoti projektą „Cython“, leidžiantį apibarstyti „Python“ kodą vykdymo laiko tipo informacija, leidžiančia jį surinkti į „C“.

Tačiau apeiti niekada nėra idealu. Ar nebūtų puiku, jei galėtume tiesiog paimti esamą „Python“ programąkaip yrair paleisti jį žymiai greičiau? Tai leidžia būtent „PyPy“.

Susijęs vaizdo įrašas: „PyPy“ vykdymo laiko naudojimas „Python“

„PyPy“ ir „CPython“

PyPy yra atsarginių „Python“ vertėjo „CPython“ pakaitalas. Nors „CPython“ kompiliuoja „Python“ į tarpinį baitų kodą, kurį tada interpretuoja virtuali mašina, „PyPy“ naudoja „just-in-time“ (JIT) kompiliaciją, kad paverstų „Python“ kodą į mašinoje esančią surinkimo kalbą.

Priklausomai nuo atliekamos užduoties, našumas gali būti dramatiškas. Vidutiniškai „PyPy“ pagreitina „Python“ maždaug 7,6 karto, kai kurios užduotys pagreitėja 50 ar daugiau kartų. „CPython“ vertėjas paprasčiausiai neatlieka tokio paties tipo optimizavimo kaip „PyPy“ ir tikriausiai niekada to nedarys, nes tai nėra vienas iš jo dizaino tikslų.

Geriausia tai, kad kūrėjas reikalauja nedaug ar be jokių pastangų, kad galėtų išnaudoti PyPy teikiamą naudą. Paprasčiausiai pakeiskite „CPython“ į „PyPy“, ir didžioji dalis baigsite. Yra keletas išimčių, aptartų toliau, tačiau „PyPy“ nurodytas tikslas yra paleisti esamą, nemodifikuotą „Python“ kodą ir suteikti jam automatinį greičio padidinimą.

Šiuo metu „PyPy“ palaiko tiek „Python 2“, tiek „Python 3“ skirtingais projekto įkūnijimais. Kitaip tariant, turite atsisiųsti skirtingas PyPy versijas, priklausomai nuo jūsų vykdomos Python versijos. „PyPy 2“ filialas „Python 2“ buvo kur kas ilgesnis, tačiau „Python 3“ versija buvo atnaujinta vėlai. Šiuo metu jis palaiko tiek „Python 3.5“ (gamybos kokybė), tiek „Python 3.6“ (beta kokybė).

Be to, kad palaiko visą pagrindinę „Python“ kalbą, „PyPy“ veikia su didžiąja dauguma „Python“ ekosistemos įrankių, tokių kaip:pip pakavimui arbavirtualenv virtualioms aplinkoms. Dauguma „Python“ paketų, net ir turintys „C“ modulius, turėtų veikti tokie, kokie yra, nors yra apribojimų, į kuriuos atsižvelgsime toliau.

Kaip veikia PyPy

„PyPy“ naudoja optimizavimo metodus, randamus kituose dinaminių kalbų „just-in-time“ kompiliatoriuose. Jis analizuoja veikiančias „Python“ programas, kad nustatytų objektų tipo informaciją, kai jie yra sukurti ir naudojami programose, tada naudoja šio tipo informaciją kaip vadovą pagreitinti. Pavyzdžiui, jei „Python“ funkcija veikia tik su vienu ar dviem skirtingais objektų tipais, „PyPy“ sugeneruoja mašininį kodą šiems konkretiems atvejams tvarkyti.

„PyPy“ optimizavimas vykdomas automatiškai vykdymo metu, todėl paprastai nereikia keisti jo našumo. Pažengęs vartotojas gali eksperimentuoti su „PyPy“ komandų eilutės parinktimis, kad sugeneruotų greitesnį kodą ypatingiems atvejams, tačiau tai reikalinga tik retai.

PyPy taip pat nukrypsta nuo to, kaip CPython tvarko kai kurias vidines funkcijas, tačiau bando išsaugoti suderinamą elgesį. Pavyzdžiui, „PyPy“ tvarko šiukšles kitaip nei „CPython“. Ne visi objektai iškart surenkami, kai jie išeina iš taikymo srities, todėl „Python“ programa, veikianti pagal „PyPy“, gali parodyti didesnį atminties pėdsaką, nei vykdant „CPython“. Bet vis tiek galite naudoti „Python“ aukšto lygio šiukšlių surinkimo valdiklius, rodomus per gc modulis, pvz gc.enable (), gc.disable ()ir gc.collect ().

Jei norite gauti informacijos apie „PyPy“ JIT elgesį vykdymo metu, „PyPy“ yra modulis, pypyjit, kuris jūsų „Python“ programai pateikia daug JIT kabliukų. Jei turite funkciją ar modulį, kuris, atrodo, blogai veikia su JIT, pypyjit leidžia jums gauti išsamią statistiką apie tai.

Kitas konkretus „PyPy“ modulis, __pypy__, atskleidžia kitas „PyPy“ specifines funkcijas, todėl gali būti naudinga rašant programas, kurios naudoja šias funkcijas. Dėl „Python“ vykdymo laiko dinamiškumo galima sukurti „Python“ programas, kurios naudoja šias funkcijas, kai yra „PyPy“, ir jas ignoruoja, kai jos nėra.

PyPy apribojimai

Stebuklinga, kaip gali atrodyti PyPy, tai nėra magija. „PyPy“ turi tam tikrų apribojimų, kurie sumažina arba panaikina jo efektyvumą tam tikrų rūšių programose. Deja, „PyPy“ nėra visiškai universalus atsargų „CPython“ vykdymo laiko pakaitalas.

„PyPy“ geriausiai veikia su grynomis „Python“ programomis

„PyPy“ visada geriausiai veikė su „grynomis“ „Python“ programomis - t. Y. Programomis, parašytomis „Python“ ir nieko kito. „Python“ paketams, kurie sąsaja su C bibliotekomis, pvz., „NumPy“, taip pat nesiseka dėl to, kaip „PyPy“ imituoja gimtąsias „CPython“ dvejetaines sąsajas.

„PyPy“ kūrėjai atsisakė šios problemos ir padarė „PyPy“ labiau suderinamą su dauguma „Python“ paketų, kurie priklauso nuo C plėtinių. Pavyzdžiui, „Numpy“ dabar labai gerai veikia su „PyPy“. Bet jei norite maksimalaus suderinamumo su C plėtiniais, naudokite „CPython“.

„PyPy“ geriausiai veikia su ilgiau veikiančiomis programomis

Vienas iš šalutinių poveikių, kaip „PyPy“ optimizuoja „Python“ programas, yra tai, kad ilgiau veikiančioms programoms daugiausia naudos iš jos optimizavimo. Kuo ilgiau programa veikia, tuo daugiau PyPy gali surinkti vykdymo laiko tipo informacijos ir daugiau optimizacijų. Vienkartiniai „Python“ scenarijai nebus naudingi. Naudingos programos paprastai turi kilpas, kurios veikia ilgą laiką arba nuolat veikia fone, pavyzdžiui, žiniatinklio sistemose.

„PyPy“ neatlieka kompiliavimo anksčiau laiko

PyPykompiliuoja „Python“ kodas, bet taip nėrakompiliatorius „Python“ kodui. Dėl PyPy optimizavimo būdo ir būdingo „Python“ dinamiškumo, jokiu būdu negalima išgauti gauto „JITted“ kodo kaip atskiro dvejetainio failo ir jį pakartotinai naudoti. Kiekviena programa turi būti sudaryta kiekvienam bėgimui. Jei norite sukompiliuoti „Python“ į greitesnį kodą, kuris gali veikti kaip atskira programa, naudokite „Cython“, „Numba“ arba šiuo metu eksperimentuojamą „Nuitka“ projektą.