{"id":38479,"date":"2019-10-31T22:23:56","date_gmt":"2019-10-31T19:23:56","guid":{"rendered":"https:\/\/prohoster.info\/blog\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2\/"},"modified":"2019-10-31T22:23:56","modified_gmt":"2019-10-31T19:23:56","slug":"put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2","title":{"rendered":"Rruga p\u00ebr t\u00eb verifikuar llojet n\u00eb 4 milion rreshta kodi Python. Pjesa 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Sot publikojm\u00eb pjes\u00ebn e dyt\u00eb t\u00eb p\u00ebrkthimit t\u00eb materialit mbi m\u00ebnyr\u00ebn se si Dropbox organizoi kontrollin e tipeve t\u00eb disa milion linjave t\u00eb kodit Python.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468235\/\"><img decoding=\"async\" alt=\"Rruga p\u00ebr t\u00eb verifikuar llojet n\u00eb 4 milion rreshta kodi Python. Pjesa 2\" src=\"\/wp-content\/uploads\/2019\/09\/3f8f396d724153a0374a3fadca190d55.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>\u2192 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468233\/\">Lexoni pjes\u00ebn e par\u00eb<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mb\u00ebshtetje zyrtare p\u00ebr tipe (PEP 484)<\/h2>\n<p>\nNe realizuam eksperimentet e para serioze me mypy n\u00eb Dropbox gjat\u00eb Jav\u00ebs s\u00eb Hack 2014. Java e Hack \u00ebsht\u00eb nj\u00eb event q\u00eb mbahet n\u00eb Dropbox p\u00ebr nj\u00eb jav\u00eb. Gjat\u00eb k\u00ebsaj kohe, punonj\u00ebsit mund t\u00eb punojn\u00eb mbi \u00e7far\u00ebdo q\u00eb d\u00ebshirojn\u00eb! Disa nga projektet m\u00eb t\u00eb njohura teknologjike t\u00eb Dropbox filluan pik\u00ebrisht gjat\u00eb aktiviteteve t\u00eb k\u00ebtilla. Si rezultat i k\u00ebtij eksperimenti, ne arrit\u00ebm p\u00ebrfundime q\u00eb mypy duket premtuese, megjith\u00ebse ky projekt akoma nuk ishte gati p\u00ebr p\u00ebrdorim t\u00eb gjer\u00eb.<\/p>\n<p>N\u00eb at\u00eb koh\u00eb, ideja p\u00ebr standardizimin e sistemeve t\u00eb sugjerimeve t\u00eb tipeve n\u00eb Python ishte n\u00eb aj\u00ebr. Si\u00e7 e thash\u00eb m\u00eb par\u00eb, q\u00eb nga Python 3.0 ishte e mundur t\u00eb p\u00ebrdoren annotimet e tipeve p\u00ebr funksionet, por ato ishin shkall\u00ebzime t\u00eb rast\u00ebsishme, pa sintaks\u00eb dhe semantik\u00eb t\u00eb caktuar. Gjat\u00eb ekzekutimit t\u00eb programit, k\u00ebto annotime, n\u00eb shumic\u00ebn e rasteve, thjesht injoroheshin. Pas Jav\u00ebs s\u00eb Hack ne filluam t\u00eb punojm\u00eb n\u00eb standardizimin e semantik\u00ebs. Ky pun\u00eb \u00e7oi n\u00eb krijimin e <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/dev\/peps\/pep-0484\/\">PEP 484<\/a><\/noindex> (n\u00eb k\u00ebt\u00eb dokument punuan s\u00eb bashku Guido van Rossum, Luka Langa dhe un\u00eb).<\/p>\n<p>Motivacionet tona mund t\u00eb shqyrtoheshin nga dy perspektiva. S\u00eb pari, ne shpresonim q\u00eb e gjith\u00eb ekosistemi i Python-it t\u00eb mund t\u00eb pranoj\u00eb nj\u00eb qasje t\u00eb p\u00ebrbashk\u00ebt n\u00eb p\u00ebrdorimin e sugjerimeve p\u00ebr tipet (type hints \u2014 nj\u00eb term i p\u00ebrdorur n\u00eb Python si nj\u00eb ekuivalent p\u00ebr \"annotimet e tipeve\"). Kjo, duke marr\u00eb parasysh rreziqet e mundshme, do t\u00eb ishte m\u00eb mir\u00eb sesa p\u00ebrdorimi i shum\u00eb qasjeve t\u00eb papajtueshme. S\u00eb dyti, ne d\u00ebshironim t\u00eb diskutonim hapur mekanizmat e annotimit t\u00eb tipeve me shum\u00eb p\u00ebrfaq\u00ebsues t\u00eb komunitetit t\u00eb Python-it. Pjes\u00ebrisht, kjo d\u00ebshir\u00eb u diktua nga fakti q\u00eb nuk donim t\u00eb dukeshim si \"rr\u00ebmbyes\" t\u00eb ideve thelb\u00ebsore t\u00eb gjuh\u00ebs n\u00eb syt\u00eb e masave t\u00eb gjera t\u00eb programuesve t\u00eb Python-it. Kjo \u00ebsht\u00eb nj\u00eb gjuh\u00eb dinamike e tipizuar, e njohur p\u00ebr \"tipizimin p\u00ebrmes patkove\". N\u00eb fillim, n\u00eb komunitet, nuk mund t\u00eb mos shfaqej nj\u00eb q\u00ebndrim pak dyshues ndaj ides\u00eb s\u00eb tipizimit statik. Por nj\u00eb q\u00ebndrim i till\u00eb p\u00ebrfundimisht u zbut \u2014 pasi u b\u00eb e qart\u00eb se tipizimi statik nuk do t\u00eb b\u00ebhej obligativ (dhe pasi njer\u00ebzit kuptuan se ishte me t\u00eb v\u00ebrtet\u00eb i dobish\u00ebm).<\/p>\n<p>Sintaksa e pranuar p\u00ebr llojet ishte shum\u00eb e ngjashme me at\u00eb q\u00eb mb\u00ebshteste n\u00eb at\u00eb koh\u00eb mypy. Dokumenti PEP 484 u publikua me Python 3.5 n\u00eb vitin 2015. Python nuk ishte m\u00eb nj\u00eb gjuh\u00eb q\u00eb mb\u00ebshteste vet\u00ebm tipizimin dinamik. M\u00eb p\u00eblqen ta mendoj k\u00ebt\u00eb ngjarje si nj\u00eb pik\u00eb t\u00eb r\u00ebnd\u00ebsishme n\u00eb historin\u00eb e Python.<\/p>\n<h2>Fillimi i migrimit<\/h2>\n<p>\nN\u00eb fund t\u00eb vitit 2015, n\u00eb Dropbox, u krijua nj\u00eb ekip prej tre personash p\u00ebr t\u00eb punuar mbi mypy. Ata ishin Guido van Rossum, Greg Price dhe David Fisher. Q\u00eb at\u00ebher\u00eb, situata filloi t\u00eb zhvillohej shum\u00eb shpejt. Pengesa e par\u00eb n\u00eb rrug\u00ebn e rritjes s\u00eb mypy ishte performanca. Si\u00e7 e p\u00ebrmenda m\u00eb lart, n\u00eb periudh\u00ebn e hershme t\u00eb zhvillimit t\u00eb projektit, mendoja t\u00eb ktheja implementimin e mypy n\u00eb gjuh\u00ebn C, por kjo ide ishte p\u00ebrjashtuar p\u00ebr momentin. Ne mbet\u00ebm n\u00eb at\u00eb q\u00eb sistemi u ekzekutua nga interpretorin CPython, i cili nuk ishte mjaft i shpejt\u00eb p\u00ebr mjete si mypy. (Projekti PyPy, nj\u00eb implementim alternativ i Python me kompilim JIT, gjithashtu nuk na ndihmoi.)<\/p>\n<p>Fatkeq\u00ebsisht, disa p\u00ebrmir\u00ebsime algoritmike na ndihmuan. Nj\u00eb \"accelerator\" i fuqish\u00ebm ishte implementimi i verifikimit inkremental. Ideja e k\u00ebtij p\u00ebrmir\u00ebsimi ishte e thjesht\u00eb: n\u00ebse t\u00eb gjitha var\u00ebsit\u00eb e modulit q\u00eb nga hera e kaluar q\u00eb mypy u ekzekutua nuk kishin ndryshuar, at\u00ebher\u00eb mund t\u00eb shfryt\u00ebzonim, gjat\u00eb pun\u00ebs me var\u00ebsit\u00eb, t\u00eb dh\u00ebnat e ruajtura gjat\u00eb sesionit t\u00eb m\u00ebparsh\u00ebm t\u00eb pun\u00ebs. Ne duhet t\u00eb kryenim vet\u00ebm verifikimin e tipeve n\u00eb skedar\u00ebt e ndryshuar dhe n\u00eb ata skedar\u00eb q\u00eb varen prej tyre. Mypy shkoi edhe p\u00ebrtej: n\u00ebse nd\u00ebrfaqja e jashtme e modulit nuk kishte ndryshuar \u2014 mypy e konsideronte se modulat e tjera q\u00eb importojn\u00eb k\u00ebt\u00eb modul nuk duhej t\u00eb kontrolloheshin p\u00ebrs\u00ebri.<\/p>\n<p>Kontrolli incremental ishte shum\u00eb i dobish\u00ebm p\u00ebr ne gjat\u00eb anottimit t\u00eb volumeve t\u00eb m\u00ebdha t\u00eb kodit ekzistues. \u00c7\u00ebshtja \u00ebsht\u00eb se ky proces zakonisht p\u00ebrfshin shum\u00eb ekzekutime iteruese t\u00eb mypy, pasi anotimet shtohen gradualisht n\u00eb kod dhe p\u00ebrmir\u00ebsohen gjithashtu nga ana e tyre. Ekzekutimi i par\u00eb i mypy ende ishte shum\u00eb i ngadalsh\u00ebm, pasi duhej t\u00eb kontrolloheshin shum\u00eb var\u00ebsi gjat\u00eb tij. At\u00ebher\u00eb, p\u00ebr t\u00eb p\u00ebrmir\u00ebsuar situat\u00ebn, implementuam nj\u00eb mekaniz\u00ebm t\u00eb cache t\u00eb larg\u00ebt. N\u00ebse mypy e zbulojn\u00eb se cache lokalisht \u00ebsht\u00eb ndoshta i vjetruar, ai ngarkon nj\u00eb snapshot aktual t\u00eb cache p\u00ebr t\u00eb gjith\u00eb baz\u00ebn e kodit nga nj\u00eb depo t\u00eb centralizuar. Pastaj, ai kryen, duke p\u00ebrdorur k\u00ebt\u00eb snapshot, kontrollin incremental. Kjo na avancoi edhe nj\u00eb hap t\u00eb konsideruesh\u00ebm n\u00eb rrug\u00ebn p\u00ebr t\u00eb rritur performanc\u00ebn e mypy.<\/p>\n<p>Ishte nj\u00eb periudh\u00eb e shpejt\u00eb dhe natyrale e implementimit t\u00eb sistemit t\u00eb kontrollit t\u00eb tipeve n\u00eb Dropbox. N\u00eb fund t\u00eb vitit 2016, ne kishim rreth 420,000 linja kod Python me anotaime tipesh. Shum\u00eb p\u00ebrdorues e pranuan me entuziaz\u00ebm kontrollin e tipeve. N\u00eb Dropbox, mypy ishte p\u00ebrdorur gjithnj\u00eb e m\u00eb shum\u00eb nga skuadra t\u00eb ndryshme t\u00eb zhvilluesve.<\/p>\n<p>N\u00eb at\u00eb koh\u00eb gjith\u00e7ka dukej mir\u00eb, por na mbetej shum\u00eb p\u00ebr t\u00eb b\u00ebr\u00eb. Filluam t\u00eb kryenim anketa t\u00eb brendshme periodike p\u00ebr t\u00eb identifikuar vendet problematike t\u00eb projektit dhe p\u00ebr t\u00eb kuptuar se cilat \u00e7\u00ebshtje duheshin zgjidhur fillimisht (kjo praktik\u00eb p\u00ebrdoret edhe sot n\u00eb kompani). Si\u00e7 u kuptua, dy detyra ishin m\u00eb t\u00eb r\u00ebnd\u00ebsishmet. E para \u2014 duhej m\u00eb shum\u00eb mbules\u00eb t\u00eb kodit me tipe, e dyta \u2014 mypy duhej t\u00eb punonte m\u00eb shpejt. Ishte krejt\u00ebsisht e qart\u00eb se puna jon\u00eb p\u00ebr t\u00eb p\u00ebrshpejtuar mypy dhe p\u00ebr ta integruar at\u00eb n\u00eb projektet e kompanis\u00eb ishte akoma shum\u00eb larg p\u00ebrfundimit. Duke e njohur plot\u00ebsisht r\u00ebnd\u00ebsin\u00eb e k\u00ebtyre dy detyrave, mor\u00ebm p\u00ebrsip\u00ebr zgjidhjen e tyre.<\/p>\n<h2>M\u00eb shum\u00eb performanc\u00eb!<\/h2>\n<p>\nKontrollat e inkrementit kan\u00eb p\u00ebrshpejtuar mypy, por ky mjet ende nuk ishte mjaft i shpejt\u00eb. Shum\u00eb nga kontrollat e inkrementit zgjatnin rreth nj\u00eb minute. Arsyet e k\u00ebtij t\u00eb problemi ishin importet ciklike. Kjo, ka t\u00eb ngjar\u00eb, nuk do ta befasonte at\u00eb q\u00eb ka punuar me kode t\u00eb m\u00ebdha t\u00eb shkruara n\u00eb Python. Ne kishim grupe me qindra module, secili prej t\u00eb cilave importonte n\u00eb m\u00ebnyr\u00eb t\u00eb t\u00ebrthort\u00eb t\u00eb gjitha t\u00eb tjerat. N\u00ebse ndonj\u00eb sked\u00eb n\u00eb ciklin e importit ishte e ndryshuar, mypy duhej t\u00eb p\u00ebrpunonte t\u00eb gjitha skedar\u00ebt q\u00eb hynin n\u00eb k\u00ebt\u00eb cik\u00ebl, dhe shpesh edhe \u00e7do modul q\u00eb importonte module nga ky cik\u00ebl. Nj\u00eb nga k\u00ebto cikle ishte i njohur si \"gunga e var\u00ebsive\", e cila shkaktoi shum\u00eb probleme n\u00eb Dropbox. Nj\u00eb her\u00eb, kjo struktur\u00eb p\u00ebrmbante disa qindra module, p\u00ebrve\u00e7 k\u00ebsaj, importohej, drejtp\u00ebrs\u00ebdrejti ose t\u00ebrthorazi, nga shum\u00eb teste, dhe p\u00ebrdorej gjithashtu n\u00eb kodin e prodhimit.<\/p>\n<p>Ne shqyrtuam mund\u00ebsin\u00eb e \"shk\u00ebputjes\" s\u00eb var\u00ebsive ciklike, por nuk kishim burimet p\u00ebr ta b\u00ebr\u00eb k\u00ebt\u00eb. Kishim shum\u00eb kod t\u00eb panjohur. N\u00eb fund, zgjodh\u00ebm nj\u00eb qasje alternative. Vendos\u00ebm q\u00eb mypy t\u00eb funksiononte shpejt, edhe me \"p\u00ebrshtatjet e var\u00ebsive\". E arrit\u00ebm k\u00ebt\u00eb q\u00ebllim p\u00ebrmes demonit mypy. Demoni \u00ebsht\u00eb nj\u00eb proces serveri, q\u00eb ofron dy mund\u00ebsi interesante. S\u00eb pari, ai mban n\u00eb kujtes\u00eb informacionin p\u00ebr t\u00eb gjith\u00eb baz\u00ebn e kodit. Kjo do t\u00eb thot\u00eb q\u00eb \u00e7do her\u00eb mypy nuk ka nevoj\u00eb t\u00eb ngarkoj\u00eb t\u00eb dh\u00ebnat e ruajtura, q\u00eb lidhen me mij\u00ebra var\u00ebsi t\u00eb importuara. S\u00eb dyti, ai analizoi me kujdes, n\u00eb nivelin e strukturave t\u00eb vogla, var\u00ebsit\u00eb midis funksioneve dhe entiteteve t\u00eb tjera. P\u00ebr shembull, n\u00ebse funksioni <code>foo<\/code> th\u00ebrret funksionin <code>bar<\/code>, at\u00ebher\u00eb ekziston nj\u00eb var\u00ebsi <code>foo<\/code> nga <code>bar<\/code>. Kur nd\u00ebrron nj\u00eb skedar, d\u00ebshira fillimisht p\u00ebrpunon vet\u00ebm skedarin q\u00eb \u00ebsht\u00eb ndryshuar, n\u00eb izolim. M\u00eb pas, ajo shqyrton ndryshimet e k\u00ebtij skedari q\u00eb jan\u00eb t\u00eb dukshme nga jasht\u00eb, si\u00e7 jan\u00eb n\u00ebnshkrimet e ndryshuara t\u00eb funksioneve. Demon p\u00ebrdor informacionin e detajuar mbi importet vet\u00ebm p\u00ebr t\u00eb verifikuar ato funksione q\u00eb v\u00ebrtet p\u00ebrdorin funksionin e ndryshuar. Zakonisht, me k\u00ebt\u00eb qasje, duhet t\u00eb kontrollohen vet\u00ebm disa funksione.<\/p>\n<p>Implementimi i t\u00eb gjitha k\u00ebtyre ishte nj\u00eb detyr\u00eb e pazakont\u00eb, pasi implementimi origjinal i mypy ishte shum\u00eb i orientuar drejt p\u00ebrpunimit t\u00eb nj\u00eb skedari n\u00eb nj\u00eb koh\u00eb. Na duhej t\u00eb p\u00ebrballeshim me nj\u00eb mori situatash t\u00eb skajshme, ekzistenca e t\u00eb cilave k\u00ebrkonte rishikime kur ndodhte ndonj\u00eb ndryshim n\u00eb kod. P\u00ebr shembull, kjo ndodh kur nj\u00eb klase i caktohet nj\u00eb klas\u00eb baz\u00eb e re. Pasi b\u00ebm\u00eb at\u00eb q\u00eb d\u00ebshironim, arrit\u00ebm t\u00eb zvog\u00eblojm\u00eb koh\u00ebn e ekzekutimit t\u00eb shumic\u00ebs s\u00eb kontrolleve inkrementale n\u00eb disa sekonda. Na dukej si nj\u00eb fitore e madhe.<\/p>\n<h2>Edhe m\u00eb shum\u00eb performanc\u00eb!<\/h2>\n<p>\nN\u00eb p\u00ebrputhje me cache-n n\u00eb distanc\u00eb q\u00eb e p\u00ebrmenda m\u00eb sip\u00ebr, demon mypy zgjidhi praktikisht t\u00eb gjitha problemet q\u00eb ndodhnin kur programi kontrollonte shpesh llojet, duke b\u00ebr\u00eb ndryshime n\u00eb nj\u00eb num\u00ebr t\u00eb vog\u00ebl skedar\u00ebsh. Megjithat\u00eb, performanca e sistemit n\u00eb variantin e tij m\u00eb t\u00eb pak\u00ebndsh\u00ebm p\u00ebr p\u00ebrdorim ende ishte larg optimales. Nj\u00eb start i past\u00ebr mypy mund t\u00eb zgjaste m\u00eb shum\u00eb se 15 minuta. Kjo ishte shum\u00eb m\u00eb tep\u00ebr se sa do t\u00eb na p\u00ebrshtatej. \u00c7do jav\u00eb situata b\u00ebhej gjithnj\u00eb e m\u00eb e keqe, pasi programuesit vazhdonin t\u00eb shkruanin kod t\u00eb ri dhe t\u00eb shtonin annotacione n\u00eb kodin ekzistues. P\u00ebrdoruesit tan\u00eb ende d\u00ebshironin m\u00eb shum\u00eb performanc\u00eb, ne ishim t\u00eb gatsh\u00ebm t\u00eb shkonim n\u00eb p\u00ebrputhje me ta.<\/p>\n<p>Ne vendos\u00ebm t\u00eb kthehemi n\u00eb nj\u00eb nga idet\u00eb e hershme n\u00eb lidhje me mypy. Konkretisht \u2014 n\u00eb transformimin e kodit Python n\u00eb kod C. Eksperimentet me Cython (\u00ebsht\u00eb nj\u00eb sistem q\u00eb lejon t\u00eb p\u00ebrkthehet kodi i shkruar n\u00eb Python n\u00eb kod C) nuk na dhan\u00eb ndonj\u00eb p\u00ebrmir\u00ebsim t\u00eb duksh\u00ebm, ndaj vendos\u00ebm t\u00eb ringjallim iden\u00eb e krijimit t\u00eb nj\u00eb kompileri t\u00eb vetin. Duke qen\u00eb se baza e kodit mypy (e shkruar n\u00eb Python) p\u00ebrfshinte tashm\u00eb t\u00eb gjitha annotimet e nevojshme t\u00eb tipeve, na dukej e vler\u00ebsueshme t\u00eb provonim t'i p\u00ebrdorim ato annotime p\u00ebr t\u00eb p\u00ebrshpejtuar funksionimin e sistemit. Un\u00eb krijova shpejt nj\u00eb prototip p\u00ebr t\u00eb testuar k\u00ebt\u00eb ide. Ai tregoi n\u00eb mikro-benchmarks t\u00eb ndryshme rritje t\u00eb performanc\u00ebs m\u00eb shum\u00eb se 10 her\u00eb. Ideja jon\u00eb ishte t\u00eb kompilonim modul\u00ebt Python n\u00eb modul\u00eb C duke p\u00ebrdorur Cython, dhe q\u00eb t\u00eb shnd\u00ebrronim annotimet e tipeve n\u00eb kontrolle tipesh q\u00eb realizohen gjat\u00eb ekzekutimit t\u00eb programit (zakonisht, annotimet e tipeve injorohen gjat\u00eb ekzekutimit t\u00eb programeve dhe p\u00ebrdoren vet\u00ebm nga sistemet e kontrollit t\u00eb tipeve). Ne, n\u00eb fakt, planifikonim t\u00eb transferonim implementimin e mypy nga Python n\u00eb nj\u00eb gjuh\u00eb q\u00eb \u00ebsht\u00eb krijuar t\u00eb jet\u00eb e tipizuar statikisht, e cila do t\u00eb dukej (dhe, p\u00ebr shumic\u00ebn e saj, do t\u00eb funksiononte) ashtu si Python. (Kjo lloj migrimi nd\u00ebrgjuh\u00ebsor ka b\u00ebr\u00eb nj\u00eb lloj tradite t\u00eb projektit mypy. Implementimi fillestar i mypy ishte shkruar n\u00eb Alore, dhe m\u00eb pas ishte nj\u00eb hibrid sintaksor i Java dhe Python).<\/p>\n<p>Fokusimi n\u00eb API-t e zgjerimeve CPython ishte \u00e7el\u00ebsi p\u00ebr t\u00eb mos humbur mund\u00ebsit\u00eb e menaxhimit t\u00eb projektit. Nuk kishte nevoj\u00eb t\u00eb implementonim nj\u00eb makin\u00eb virtuale ose \u00e7do bibliotek\u00eb q\u00eb mypy kishte nevoj\u00eb. P\u00ebr m\u00eb tep\u00ebr, ne ende do t\u00eb kishim qasje n\u00eb t\u00eb gjith\u00eb ekosistemin e Python-it, do t\u00eb ishin n\u00eb dispozicion t\u00eb gjith\u00eb mjetet (si\u00e7 \u00ebsht\u00eb pytest). Kjo do t\u00eb thoshte se ne do t\u00eb mund t\u00eb vazhdonim t\u00eb p\u00ebrdornim kodin interpretues t\u00eb Python-it gjat\u00eb zhvillimit, duke na lejuar q\u00eb t\u00eb vazhdonim t\u00eb punonim me nj\u00eb skem\u00eb shum\u00eb t\u00eb shpejt\u00eb p\u00ebr ndryshimin e kodit dhe testimin e tij, n\u00eb vend q\u00eb t\u00eb prisnim p\u00ebr kompilimin e kodit. Ishte sikur na shkonte mrekullisht, si\u00e7 thuhet, t\u00eb rrinim n\u00eb dy karrige, dhe na p\u00eblqente kjo.<\/p>\n<p>Kompilatori q\u00eb e quajt\u00ebm mypyc (sepse ai p\u00ebrdor mypy p\u00ebr analizimin e tipeve) doli t\u00eb jet\u00eb nj\u00eb projekt mjaft i suksessh\u00ebm. N\u00eb p\u00ebrgjith\u00ebsi, arrit\u00ebm nj\u00eb rritje prej rreth 4 her\u00eb n\u00eb koh\u00ebn e nisjes s\u00eb shpesht\u00eb t\u00eb mypy pa p\u00ebrdorur caching. Zhvillimi i b\u00ebrtham\u00ebs s\u00eb projektit mypyc mori rreth 4 muaj kalendarik\u00eb p\u00ebr nj\u00eb ekip t\u00eb vog\u00ebl q\u00eb p\u00ebrfshinte Michael Sullivan, Ivan Levkivsky, Hugh Han dhe mua. Ky volum pune ishte shum\u00eb m\u00eb i vog\u00ebl se sa do t\u00eb nevojitej p\u00ebr t\u00eb shkruar p\u00ebrs\u00ebri mypy, p\u00ebr shembull n\u00eb C++ ose Go. Ndryshimet q\u00eb na duhej t\u00eb b\u00ebnim n\u00eb projekt gjithashtu ishin shum\u00eb m\u00eb t\u00eb pakta se ato q\u00eb do t\u00eb ishin t\u00eb nevojshme p\u00ebr ta shkruar at\u00eb n\u00eb nj\u00eb gjuh\u00eb tjet\u00ebr. Ne gjithashtu shpresonim se do t\u00eb arrinim ta \u00e7onim mypyc n\u00eb nj\u00eb nivel ku programuesit e tjer\u00eb nga Dropbox do t\u00eb mund ta p\u00ebrdorin p\u00ebr t\u00eb kompiluar dhe p\u00ebrshpejtuar kodin e tyre.<\/p>\n<p>P\u00ebr t\u00eb arritur nj\u00eb nivel t\u00eb till\u00eb performance, na duhej t\u00eb zbatonim disa zgjidhje inxhinierike interesante. K\u00ebshtu, kompajleri mund t\u00eb p\u00ebrshpejtoj\u00eb ekzekutimin e shum\u00eb operacioneve fal\u00eb p\u00ebrdorimit t\u00eb strukturave t\u00eb shpejta t\u00eb niveleve t\u00eb ul\u00ebta n\u00eb C. P\u00ebr shembull, thirrja e nj\u00eb funksioni t\u00eb kompajluar p\u00ebrkthehet n\u00eb nj\u00eb thirrje t\u00eb funksionit C. Nj\u00eb thirrje e till\u00eb ekzekutohet shum\u00eb m\u00eb shpejt se nj\u00eb thirrje e funksionit t\u00eb interpretuar. Disa operacione, t\u00eb tilla si k\u00ebrkimi n\u00eb fjalor, ende p\u00ebrfshinin p\u00ebrdorimin e thirrjeve t\u00eb zakonshme t\u00eb C-API nga CPython, t\u00eb cilat, pas kompajlimit, rezultuan vet\u00ebm pak m\u00eb t\u00eb shpejta. Arrit\u00ebm t\u00eb eliminojm\u00eb ngarkes\u00ebn shtes\u00eb n\u00eb sistem, e shkaktuar nga interpretimi, por n\u00eb k\u00ebt\u00eb rast, ky i fundit ofroi vet\u00ebm nj\u00eb fitim t\u00eb vog\u00ebl n\u00eb aspektin e performanc\u00ebs.<\/p>\n<p>P\u00ebr t\u00eb identifikuar operacionet m\u00eb t\u00eb zakonshme \"t\u00eb ngadalta\", kryem profilizimin e kodit. T\u00eb pajisur me t\u00eb dh\u00ebnat e marra, p\u00ebrpiqeshim ose ta \"rregullojm\u00eb\" mypyc-in q\u00eb t\u00eb gjeneronte m\u00eb shum\u00eb kod C t\u00eb shpejt\u00eb p\u00ebr operacione t\u00eb tilla, ose t\u00eb rishkruanim kodin p\u00ebrkat\u00ebs Python duke p\u00ebrdorur operacione m\u00eb t\u00eb shpejta (ndonj\u00ebher\u00eb nuk kishim nj\u00eb zgjidhje t\u00eb thjesht\u00eb p\u00ebr ndonj\u00eb problem). Rishkrimi i kodit Python shpesh rezultonte t\u00eb ishte nj\u00eb zgjidhje m\u00eb e leht\u00eb p\u00ebr problemin se sa implementimi i ekzekutimit automatik t\u00eb t\u00eb nj\u00ebjt\u00ebs transformim n\u00eb kompilator. N\u00eb afatgjat\u00eb, d\u00ebshironim t\u00eb automatizonim shum\u00eb nga k\u00ebto transformime, por n\u00eb at\u00eb moment ishim t\u00eb fokusuar n\u00eb p\u00ebrshpejtimin e mypy me sa m\u00eb pak p\u00ebrpjekje. Dhe, duke ecur drejt k\u00ebsaj q\u00ebllimi, preknim disa k\u00ebnde.<\/p>\n<p>Vazhdon\u2026<\/p>\n<p><b>T\u00eb nderuar lexues!<\/b> Cilat ndjenja ju ka shkaktuar projekti mypy kur m\u00ebsuat p\u00ebr ekzistenc\u00ebn e tij?<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/vps_start\/\"><img decoding=\"async\" alt=\"Rruga p\u00ebr t\u00eb verifikuar llojet n\u00eb 4 milion rreshta kodi Python. Pjesa 2\" src=\"\/wp-content\/uploads\/2019\/09\/e3c1dd40228b56d0196fd65e4df22a59.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/ru-rub\/#order\"><img decoding=\"async\" alt=\"Rruga p\u00ebr t\u00eb verifikuar llojet n\u00eb 4 milion rreshta kodi Python. Pjesa 2\" src=\"\/wp-content\/uploads\/2019\/09\/263173dd3ab487da330ff9063e3c180e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468235\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 Dropbox \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u2192 \u0427\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 (PEP 484) \u041c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0441 mypy \u0432 Dropbox \u0432\u043e \u0432\u0440\u0435\u043c\u044f Hack Week 2014. Hack Week \u2014 \u044d\u0442\u043e \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c\u043e\u0435 Dropbox \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0438. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28879,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38479","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 Dropbox \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u2192 \u0427\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 (PEP 484) \u041c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0441 mypy \u0432 Dropbox \u0432\u043e \u0432\u0440\u0435\u043c\u044f Hack Week 2014. Hack Week \u2014 \u044d\u0442\u043e \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c\u043e\u0435 Dropbox \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0438. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u0427\u0430\u0441\u0442\u044c 2 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 Dropbox \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u2192 \u0427\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 (PEP 484) \u041c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0441 mypy \u0432 Dropbox \u0432\u043e \u0432\u0440\u0435\u043c\u044f Hack Week 2014. Hack Week \u2014 \u044d\u0442\u043e \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c\u043e\u0435 Dropbox \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0438. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:23:56+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:23:56+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Rruga e verifikimit t\u00eb tipeve t\u00eb 4 milion linjave t\u00eb kodit Python. Pjesa 2 | ProHoster","description":"Sot publikojm\u00eb pjes\u00ebn e dyt\u00eb t\u00eb p\u00ebrkthimit t\u00eb materialit mbi m\u00ebnyr\u00ebn se si Dropbox organizoi kontrollin e tipeve t\u00eb disa milion linjave t\u00eb kodit Python. \u2192 Lexoni pjes\u00ebn e par\u00eb mb\u00ebshtetje zyrtare p\u00ebr tipet (PEP 484) Ne kemi b\u00ebr\u00eb eksperimentet e para serioze me mypy n\u00eb Dropbox gjat\u00eb Jav\u00ebs s\u00eb Hack 2014. Java e Hack \u00ebsht\u00eb nj\u00eb ngjarje e zhvilluar nga Dropbox p\u00ebr nj\u00eb jav\u00eb. N\u00eb k\u00ebt\u00eb koh\u00eb","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u0427\u0430\u0441\u0442\u044c 2 | ProHoster","og:description":"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 Dropbox \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u2192 \u0427\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 (PEP 484) \u041c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0441 mypy \u0432 Dropbox \u0432\u043e \u0432\u0440\u0435\u043c\u044f Hack Week 2014. Hack Week \u2014 \u044d\u0442\u043e \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c\u043e\u0435 Dropbox \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0438. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:23:56+00:00","article:modified_time":"2019-10-31T19:23:56+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38479","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 22:13:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:08:32","updated":"2026-01-23 22:13:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/38479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=38479"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/38479\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/28879"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=38479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=38479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=38479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}