“Hidup ini singkat, Anda perlukan ular sawa”!
Pengekod lama sangat menyukai keanggunan Python Walau bagaimanapun, dalam persekitaran pengeluaran, ciri bahasa dinamik seperti Python yang tidak dibina dengan prestasi sebagai keutamaan boleh membahayakan atau PyTorch terutamanya menggunakan python sebagai bahasa antara muka untuk berinteraksi dengan perpustakaan C/C++ yang dioptimumkan.
Terdapat banyak cara untuk mengoptimumkan prestasi program Python Dari perspektif pengkompil, prestasi tinggi boleh dibenamkan ke dalam bahasa peringkat rendah yang boleh dianalisis secara statik, seperti C atau C++, dan disusun menjadi Native masa jalan. kod mesin dengan overhed yang lebih rendah membolehkan ia setanding dalam prestasi dengan C/C++.
Kodon boleh dilihat sebagai pengkompil sedemikian, menggunakan kompilasi lebih awal, pemeriksaan jenis dwiarah khusus dan perwakilan perantaraan dwiarah baharu untuk mendayakan kekhususan pilihan dalam sintaks bahasa dan pengoptimuman Domain. Ia membolehkan pengaturcara profesional menulis kod berprestasi tinggi dengan cara yang intuitif, tahap tinggi dan biasa.
Tidak seperti pelaksanaan Python berorientasikan prestasi lain (seperti PyPy atau Numba), Codon dibina dari bawah ke atas sebagai sistem kendiri, disusun lebih awal ke dalam boleh laku statik, tanpa memerlukan masa jalan Python sedia ada (cth., CPython). Oleh itu, pada dasarnya, Codon boleh mencapai prestasi yang lebih baik dan mengatasi isu khusus runtime Python seperti kunci penterjemah global. Dalam amalan, Codon menyusun skrip Python (seperti pengkompil C) ke dalam kod asli, berjalan 10 hingga 100 kali lebih pantas daripada pelaksanaan yang ditafsirkan.
Kodon dimodelkan berdasarkan bahasa Seq, iaitu DSL bioinformatik. Seq pada asalnya direka sebagai DSL gaya piramid dengan banyak kelebihan, seperti kemudahan diterima pakai, prestasi cemerlang dan keupayaan ekspresif yang berkuasa. Walau bagaimanapun, disebabkan peraturan jenis yang ketat, Seq tidak menyokong banyak binaan bahasa Python biasa, dan ia juga tidak menyediakan mekanisme untuk melaksanakan pengoptimuman pengkompil baharu dengan mudah. Dengan menggunakan IR dwiarah dan penyemak jenis yang dipertingkatkan, Codon menyediakan penyelesaian umum kepada masalah ini berdasarkan Seq.
Codon merangkumi kebanyakan ciri Python dan menyediakan rangka kerja untuk pengoptimuman dalam kawasan tertentu. Selain itu, sistem jenis fleksibel disediakan untuk mengendalikan pelbagai ciri bahasa dengan lebih baik. Sistem jenis adalah serupa dengan RPython dan PyPy dan sistem jenis statik. Idea ini juga telah digunakan dalam konteks bahasa dinamik lain, seperti PRuby. Pendekatan yang digunakan oleh IR dwiarah mempunyai persamaan dengan sistem jenis boleh pasang ke hadapan, seperti rangka kerja pemeriksaan Java.
Walaupun Ungkapan Perantaraan Codon bukanlah IR pertama yang boleh disesuaikan, ia tidak menyokong penyesuaian semua kandungan, sebaliknya memilih penyesuaian yang ringkas dan jelas yang boleh digabungkan dengan dwiarah untuk mencapai ciri yang lebih kompleks. Dari segi struktur, CIR diilhamkan oleh LLVM dan IR Rust. IR ini mendapat manfaat daripada set dan struktur nod yang sangat dipermudahkan, yang seterusnya memudahkan pelaksanaan saluran IR. Walau bagaimanapun, dari segi struktur, pelaksanaan tersebut secara asasnya menstruktur semula kod sumber, menghapuskan maklumat semantik yang mesti difaktorkan semula untuk melaksanakan transformasi. Untuk menangani kelemahan ini, Taichi mengguna pakai struktur hierarki yang mengekalkan aliran kawalan dan maklumat semantik dengan mengorbankan peningkatan kerumitan. Walau bagaimanapun, tidak seperti Codon, IR ini sebahagian besarnya agnostik pada bahagian hadapan bahasa mereka, menjadikan mengekalkan ketepatan jenis dan menjana kod baharu agak tidak praktikal atau bahkan mustahil. Oleh itu, CIR mengeksploitasi hierarki dipermudahkan kaedah ini, mengekalkan nod aliran kawalan kod sumber dan subset nod dalaman yang dikurangkan sepenuhnya. Yang penting, ia meningkatkan struktur ini dengan dwiarah, menjadikan IR baharu mudah dijana dan dimanipulasi.
Kodon menggunakan semakan jenis statik dan menyusun ke LLVM IR tanpa menggunakan sebarang maklumat Jenis masa jalan, serupa dengan kerja sebelumnya pada pemeriksaan jenis hujung ke hujung dalam konteks bahasa dinamik seperti Python. Untuk tujuan ini, Codon dihantar dengan sistem jenis dua hala statik, dipanggil LTS-DI, yang menggunakan inferens gaya HindleyMilner untuk membuat kesimpulan jenis dalam program tanpa memerlukan pengguna untuk menganotasi jenis secara manual (amalan ini, walaupun disokong, tidak disokong dalam Python Tidak biasa di kalangan pemaju).
Disebabkan sifat sintaks Python dan simpulan bahasa Python biasa, LTS-DI menyesuaikan penaakulan seperti hm standard untuk menyokong binaan Python yang ketara seperti pemahaman, iterator, penjana, operasi Fungsi kompleks, parameter berubah-ubah, semakan jenis statik , dsb. Untuk mengendalikan ini dan banyak struktur lain, LTS-DI bergantung pada:
Banyak binaan Python juga memerlukan ungkapan masa kompilasi (serupa dengan ungkapan pr termampat C++), yang disokong oleh kodon. Walaupun pendekatan ini tidak biasa dalam amalan (cth., templat C++ menggunakan singleton), dan instantiasi malas sudah digunakan dalam sistem jenis HMF, kami tidak mengetahui penggunaan gabungannya dalam konteks program Python yang disemak jenis. Akhir sekali, sila ambil perhatian bahawa sistem jenis Codon dalam pelaksanaan semasa adalah statik sepenuhnya dan tidak melakukan sebarang inferens jenis masa jalan oleh itu, beberapa ciri Python, seperti polimorfisme masa jalan atau refleksi masa jalan, tidak disokong. Dalam konteks pengkomputeran saintifik, mengalih keluar ciri ini didapati mewakili pertukaran yang munasabah antara utiliti dan prestasi.
Banyak bahasa disusun dengan cara yang agak mudah: kod sumber dihuraikan ke dalam pokok sintaks abstrak (AST), yang dioptimumkan dan Tukar kepada kod mesin. Walaupun pendekatan ini agak mudah untuk dilaksanakan, selalunya AST mengandungi lebih banyak jenis nod daripada yang diperlukan untuk mewakili program tertentu. Kerumitan ini boleh menjadikan pelaksanaan pengoptimuman, transformasi dan analisis sukar atau bahkan tidak praktikal. Pendekatan lain ialah menukar AST kepada perwakilan perantaraan (IR) sebelum melaksanakan pas pengoptimuman Perwakilan perantaraan biasanya mengandungi set nod yang dipermudahkan dengan semantik yang jelas, menjadikannya lebih kondusif untuk penukaran dan pengoptimuman.
Codon melaksanakan pendekatan ini dalam IRnya, yang terletak di antara peringkat semakan jenis dan pengoptimuman, seperti yang ditunjukkan dalam imej di atas. Perwakilan perantaraan Codon (CIR) jauh lebih mudah daripada AST, dengan struktur yang lebih ringkas dan jenis nod yang lebih sedikit. Walaupun kesederhanaannya, perwakilan perantaraan Codon mengekalkan banyak maklumat semantik kod sumber dan memudahkan "pengurangan progresif", membolehkan pengoptimuman pada pelbagai peringkat abstraksi.
CIR sebahagiannya diilhamkan oleh IR LLVM. Dalam LLVM, struktur yang serupa dengan bentuk peruntukan statik tunggal (SSA) diguna pakai, membezakan nilai dan pembolehubah yang diperuntukkan di lokasi, yang secara konsepnya serupa dengan lokasi ingatan mula-mula berjalan secara linear, di mana kod sumber dihuraikan ke dalam pepohon sintaks abstrak yang mana semakan jenis dilakukan untuk menjana ungkapan perantaraan. Walau bagaimanapun, tidak seperti rangka kerja kompilasi lain, Codon adalah dwiarah dan pengoptimuman IR boleh kembali ke peringkat semakan jenis untuk menjana nod baharu yang tiada dalam program asal. Rangka kerja ini adalah "boleh diperluaskan domain" dan "pemalam DSL" terdiri daripada modul perpustakaan, sintaks dan pengoptimuman khusus domain.
Untuk mencapai pemetaan struktur kod sumber, nilai boleh disarangkan ke dalam pokok besar yang sewenang-wenangnya. Struktur ini membolehkan CIR mudah dikurangkan kepada graf aliran kawalan, sebagai contoh. Walau bagaimanapun, tidak seperti LLVM, CIR pada asalnya menggunakan nod eksplisit yang dipanggil aliran untuk mewakili aliran kawalan, membenarkan surat-menyurat struktur rapat dengan kod sumber. Mewakili secara jelas hierarki aliran kawalan adalah serupa dengan pendekatan yang diambil oleh Taichi. Yang penting, ini menjadikan pengoptimuman dan transformasi yang bergantung pada konsep aliran kawalan yang tepat lebih mudah untuk dilaksanakan. Contoh mudah ialah strim, yang menyimpan gelung eksplisit dalam CIR dan membolehkan kodon mengenal pasti corak gelung biasa dengan mudah, dan bukannya mentafsirkan maze cawangan seperti yang dilakukan dalam LLVM IR.
CIR tidak secara eksplisit mewakili pengendali seperti "+", tetapi menukarkannya kepada panggilan fungsi yang sepadan. Ini membolehkan operator lancar membebankan jenis sewenang-wenangnya, dengan semantik yang sama seperti Python. Sebagai contoh, operator + memutuskan untuk menambah panggilan.
Persoalan semula jadi yang timbul daripada pendekatan ini ialah cara melaksanakan pengendali untuk jenis primitif seperti int dan apungan. Kodon menyelesaikan masalah ini dengan membenarkan inline LLVM IR melalui anotasi fungsi @llvm, yang membolehkan semua operator primitif ditulis dalam kod sumber kodon. Maklumat tentang sifat pengendali seperti komutatif dan persekutuan boleh dihantar sebagai anotasi dalam IR.
Saluran kompilasi tradisional adalah linear dalam aliran datanya: kod sumber dihuraikan kepada AST, biasanya ditukar kepada IR, dioptimumkan dan akhirnya ditukar kepada kod mesin. Codon memperkenalkan konsep IR dwiarah, di mana saluran IR boleh kembali ke peringkat pemeriksaan jenis, menjana nod IR baharu dan nod khusus yang tidak wujud dalam program sumber. Faedah termasuk:
Begitu juga, saluran IR itu sendiri boleh menjadi generik, menggunakan sistem jenis ekspresi Codon untuk beroperasi pada pelbagai jenis. Jenis IR tidak mempunyai generik yang berkaitan (tidak seperti jenis AST). Walau bagaimanapun, setiap jenis CIR membawa rujukan kepada jenis AST yang digunakan untuk menjananya, serta sebarang parameter jenis generik AST. Jenis AST yang berkaitan ini digunakan apabila menggunakan semula penyemak jenis dan membenarkan jenis CIR disoal untuk generik asasnya. Ambil perhatian bahawa jenis CIR sepadan dengan abstraksi peringkat tinggi LLVM jenis IR adalah lebih rendah dan tidak dipetakan terus kepada jenis Kodon.
Malah, keupayaan untuk membuat instantiate jenis baharu semasa pas CIR adalah penting untuk banyak operasi CIR. Contohnya, mencipta tuple (x,y) daripada nilai CIR yang diberikan x dan y memerlukan instantiate tuple jenis tuple baharu[X,Y] (dengan pengecam huruf besar ialah jenis ungkapan), yang seterusnya memerlukan Instantiate baharu operator tuple untuk semakan kesamaan dan ketidaksamaan, lelaran, pencincangan dan banyak lagi. Walau bagaimanapun, memanggil semula pemeriksa jenis menjadikan ini proses yang lancar.
Gambar di atas ialah contoh mudah untuk memetakan fungsi Fibonacci kepada kod sumber CIR. Fungsi fib memetakan ke CIR BodiedFunc dengan hujah integer tunggal. Badan mengandungi aliran kawalan If, yang mengembalikan pemalar atau memanggil fungsi secara rekursif untuk mendapatkan hasilnya. Ambil perhatian bahawa pengendali seperti + diterjemahkan ke dalam panggilan fungsi (cth., tambah), tetapi IR dipetakan kepada kod sumber mentah dalam strukturnya, membenarkan pemadanan dan penukaran corak mudah. Dalam kes ini, cukupkan beban pengendali Panggilan, semak sama ada fungsi itu memenuhi kriteria untuk penggantian dan lakukan tindakan jika ia sepadan. Pengguna juga boleh menentukan skema traversal mereka sendiri dan mengubah suai struktur IR sesuka hati.
CIR menyediakan analisis komprehensif dan infrastruktur transformasi: pengguna menulis pas menggunakan pelbagai kelas aplikasi terbina dalam CIR dan mendaftarkannya dengan pengurus kata laluan, di mana saluran yang lebih kompleks boleh mengambil kelebihan dwiarah CIR dan gunakan semula penyemak jenis untuk jenis, fungsi dan kaedah CIR baharu, contoh yang ditunjukkan dalam rajah di bawah.
Dalam contoh ini, panggilan ke fungsi foo akan dicari dan selepas setiap panggilan parameter yang mengesahkan foo dan outputnya akan dimasukkan panggilan. Memandangkan kedua-dua fungsi adalah generik, penyemak jenis digunakan semula untuk menjana tiga instantiasi pengesahan unik yang baharu. Menggerakkan jenis dan fungsi baharu memerlukan pengendalian pengkhususan yang mungkin dan melaksanakan nod tambahan (contohnya, kaedah operator == __eq__ mesti dilaksanakan dalam contoh untuk melaksanakan pengesahan), serta menyimpan cache pelaksanaan untuk kegunaan kemudian.
Codon menggunakan LLVM untuk menjana kod asli. Penukaran daripada Codon IR kepada LLVM IR biasanya merupakan proses yang mudah. Kebanyakan jenis Codon juga boleh ditukar secara intuitif kepada jenis IR LLVM: int menjadi i64, float menjadi dua kali ganda, bool menjadi int8 dan seterusnya - penukaran ini juga membenarkan kesalingoperasian C/C++. Jenis tuple ditukar kepada jenis struct yang mengandungi jenis elemen yang sesuai, yang diluluskan mengikut nilai (nota, tupel tidak boleh diubah dalam Python dengan cara pengendalian tupel ini membolehkan LLVM dioptimumkan sepenuhnya dalam kebanyakan kes mereka); Jenis rujukan, seperti senarai, Dict, dsb., dilaksanakan sebagai objek yang diperuntukkan secara dinamik dan diluluskan melalui rujukan ini mengikut jenis semantik pembolehubah Python dan boleh dinaik taraf kepada jenis pilihan seperti yang diperlukan untuk mengendalikan tiada jenis pilihan diluluskan Dilaksanakan sebagai tuple jenis i1 LLVM dan jenis asas, di mana yang pertama menunjukkan sama ada jenis pilihan mengandungi nilai. Pilihan pada jenis rujukan direka khusus untuk menggunakan penuding nol untuk menunjukkan nilai yang hilang.
Penjana ialah binaan bahasa yang popular dalam Python sebenarnya, setiap gelung untuk berulang melalui penjana. Yang penting, penjana dalam Codon tidak membawa overhed tambahan dan menyusun kepada kod standard C yang setara apabila boleh. Untuk tujuan ini, Codon menggunakan coroutine LLVM untuk melaksanakan penjana.
Codon menggunakan perpustakaan masa jalan kecil semasa melaksanakan kod. Khususnya, pengumpul sampah Boehm digunakan untuk mengurus memori yang diperuntukkan. Codon menyediakan dua mod kompilasi: nyahpepijat dan keluarkan. Mod nyahpepijat termasuk maklumat penyahpepijatan penuh, membenarkan program dinyahpepijat menggunakan alatan seperti GDB dan LLDB, serta maklumat surih balik penuh termasuk nama fail dan nombor baris. Mod keluaran melaksanakan lebih banyak pengoptimuman (termasuk pengoptimuman -O3 daripada GCC/Clang) dan mengetepikan beberapa maklumat keselamatan dan penyahpepijatan. Oleh itu, pengguna boleh menggunakan mod nyahpepijat untuk kitaran pengaturcaraan dan penyahpepijatan yang pantas serta mod keluaran untuk penggunaan berprestasi tinggi.
Oleh kerana fleksibiliti dan IR dwiarah rangka kerja, serta ekspresi keseluruhan sintaks Python, aplikasi Codon biasanya melaksanakan kebanyakan fungsi komponen khusus domain dalam kod sumber itu sendiri. Pendekatan modular boleh dibungkus sebagai perpustakaan dinamik dan fail sumber Codon. Pemalam ini boleh dimuatkan oleh pengkompil kodon pada masa penyusunan.
Sesetengah rangka kerja, seperti MLIR, membenarkan penyesuaian. Condon IR, sebaliknya, mengehadkan beberapa jenis nod dan bergantung pada dwiarah untuk fleksibiliti selanjutnya. Khususnya, CIR membenarkan pengguna memperoleh daripada jenis, aliran, pemalar dan arahan "tersuai" yang berinteraksi dengan rangka kerja yang lain melalui antara muka deklaratif. Contohnya, nod tersuai datang daripada kelas asas tersuai yang sesuai (jenis tersuai, aliran tersuai, dsb.) dan mendedahkan "pembina" untuk membina IR LLVM yang sepadan. Melaksanakan jenis dan nod tersuai melibatkan penentuan penjana (cth. jenis bangunan) melalui kaedah maya kelas jenis tersuai itu sendiri mentakrifkan kaedah getBuilder untuk mendapatkan contoh penjana ini. Pembinaan nod piawai ini berfungsi dengan lancar dengan saluran dan analitik sedia ada.
Banyak program Python standard sudah berfungsi di luar kotak, menjadikannya mudah untuk mengoptimumkan beberapa corak biasa dalam kod Python, seperti kemas kini Kamus (boleh dioptimumkan untuk menggunakan carian tunggal dan bukannya dua), atau penambahan rentetan berturut-turut (boleh diruntuhkan menjadi gabungan tunggal untuk mengurangkan overhed peruntukan).
Graf di atas menunjukkan prestasi masa jalan Codon, serta prestasi CPython (v3.10) dan PyPy (v7.3), pada penanda aras, dengan had satu Set penanda aras "teras", tanpa kebergantungan pada perpustakaan luaran. Berbanding dengan CPython dan PyPy, Codon sentiasa lebih pantas, kadangkala mengikut susunan magnitud. Walaupun penanda aras adalah penunjuk prestasi yang baik, mereka bukan tanpa kelemahan dan selalunya tidak menceritakan keseluruhan cerita. Codon membolehkan pengguna menulis kod Python ringkas untuk pelbagai domain sambil menyampaikan prestasi tinggi pada aplikasi dan set data dunia sebenar.
Oleh kerana Codon dibina secara bebas daripada runtime Python sedia ada, ia tidak terjejas oleh kunci penterjemah global CPython dan oleh itu boleh Mengambil kesempatan sepenuhnya daripada multithreading. Untuk menyokong pengaturcaraan selari, sambungan kepada Codon membolehkan pengguna akhir menggunakan OpenMP.
Untuk OpenMP, badan gelung selari digariskan sebagai fungsi baharu, yang kemudiannya dipanggil oleh berbilang urutan oleh masa jalan OpenMP. Sebagai contoh, badan gelung dalam rajah di bawah akan digariskan sebagai fungsi f yang mengambil sebagai parameter pembolehubah a, b, c dan pembolehubah gelung i.
Panggilan ke f kemudiannya akan dimasukkan ke dalam fungsi baharu g, yang memanggil rutin penjadualan round-robin dinamik OpenMP dengan saiz blok 10. Akhir sekali, semua benang dalam baris gilir akan memanggil g melalui fungsi fork_call OpenMP. Hasilnya ditunjukkan dalam coretan kod yang betul dalam imej di atas, dengan perhatian khusus diberikan kepada pengendalian pembolehubah persendirian serta pembolehubah yang dikongsi. Pengurangan pembolehubah juga memerlukan penjanaan kod tambahan untuk operasi atom (atau menggunakan kunci), dan lapisan tambahan panggilan API OpenMP.
Kompilasi dwiarah Codon ialah komponen utama pas OpenMP. "Templat" untuk pelbagai gelung dilaksanakan dalam kod sumber Codon. Selepas analisis kod, "templat" ini diedarkan dan dikhususkan dengan mengisi badan gelung, saiz dan jadual blok, menulis semula ungkapan yang bergantung pada pembolehubah yang dikongsi, dsb. Reka bentuk ini sangat memudahkan pelaksanaan pas dan menambah tahap serba boleh.
Tidak seperti Clang atau GCC, saluran OpenMP Codon boleh menyimpulkan pembolehubah yang dikongsi dan yang peribadi, serta kod untuk sebarang pengurangan yang sedang berlaku. Pengurangan tersuai boleh dibuat hanya dengan menyediakan kaedah sihir atom yang sesuai (cth. .aborom_add) pada jenis pengurangan. Kodon melelar melalui penjana (tingkah laku lalai gelung Python) kepada "gelung imperatif", iaitu gelung gaya C dengan nilai mula, henti dan langkah. Jika teg @par hadir, gelung paksa akan ditukar menjadi gelung selari OpenMP. Gelung selari tanpa paksaan disejajarkan dengan menghasilkan tugas OpenMP baharu untuk setiap lelaran gelung dan meletakkan titik penyegerakan selepas gelung. Skim ini membenarkan semua Python for-gelung disejajarkan.
Penukaran OpenMP dilaksanakan sebagai satu set CIR yang dipadankan dengan untuk gelung yang ditandakan dengan atribut @par dan gelung ini ditukar kepada binaan OpenMP yang sesuai dalam CIR. Hampir semua struktur OpenMP dilaksanakan sebagai fungsi tertib tinggi Condon itu sendiri.
CoLa ialah pemampatan data berasaskan blok penyasaran DSL berasaskan Codon, yang kini digunakan oleh banyak imej dan video biasa Teras algoritma pemampatan. Jenis pemampatan ini sangat bergantung pada membahagikan kawasan piksel kepada satu siri blok yang lebih kecil dan lebih kecil, membentuk hierarki data berbilang dimensi di mana setiap blok perlu mengetahui kedudukannya berbanding dengan blok lain. Sebagai contoh, pemampatan video H.264 membahagikan bingkai input kepada satu siri blok 16x16 piksel, setiap piksel menjadi blok 8x8 piksel dan kemudian membahagikan piksel ini kepada blok 4x4 piksel. Menjejak kedudukan antara tampung piksel individu ini memerlukan sejumlah besar data maklumat, yang dengan cepat mengaburkan algoritma asas dalam pelaksanaan sedia ada.
CoLa memperkenalkan abstraksi tatasusunan berbilang dimensi hierarki (HMDA), yang memudahkan ungkapan dan penggunaan data hierarki. HMDA mewakili tatasusunan berbilang dimensi dengan tanggapan kedudukan, yang menjejaki asal usul mana-mana HMDA tertentu berbanding beberapa sistem koordinat global. HMDA juga boleh menjejaki saiz dan panjang langkah mereka. Dengan tiga keping data ini, mana-mana HMDA boleh menentukan kedudukannya berbanding mana-mana HMDA lain pada bila-bila masa dalam program. CoLa mengabstrak HMDA dalam Codon sebagai perpustakaan yang berpusat di sekitar dua jenis data baharu: blok dan paparan. Blok mencipta dan memiliki tatasusunan berbilang dimensi asas, dan pandangan menghala ke kawasan tertentu blok. CoLa mendedahkan dua hierarki utama - operasi pembinaan, penyalinan kedudukan dan pembahagian, yang membuat blok dan pandangan masing-masing. CoLa menyokong pengindeksan standard menggunakan indeks integer dan hirisan, tetapi juga memperkenalkan dua skim pengindeksan unik yang meniru cara piawaian mampatan menggambarkan akses data. Indeks "Di luar sempadan" membenarkan pengguna mengakses data di sekeliling paparan, manakala indeks "terurus" membenarkan pengguna mengindeks satu HMDA menggunakan HMDA yang lain.
Walaupun gabungan fizik Codon dan abstraksi CoLa memberikan pengguna kelebihan bahasa peringkat tinggi dan abstraksi khusus mampatan, abstraksi HMDA memperkenalkan overhed masa jalan yang ketara disebabkan oleh operasi pengindeksan tambahan yang diperlukan. Untuk pemampatan, banyak akses HMDA berlaku pada tahap pengiraan paling dalam, jadi sebarang pengiraan tambahan selain daripada mengakses tatasusunan asal terbukti memudaratkan masa jalan. CoLa memanfaatkan rangka kerja Codon untuk melaksanakan hierarki, mengurangkan bilangan paparan perantaraan yang dibuat, dan percubaan penyebaran untuk membuat kesimpulan kedudukan mana-mana HMDA tertentu. Ini mengurangkan saiz keseluruhan hierarki dan memudahkan pengiraan indeks sebenar. Tanpa pengoptimuman ini, CoLa secara purata 48.8×, 6.7× dan 20.5× lebih perlahan daripada kod C rujukan untuk JPEG dan H.264]. Selepas pengoptimuman, prestasi telah bertambah baik, dengan purata masa berjalan masing-masing 1.06×, 0.67× dan 0.91× berbanding dengan kod rujukan yang sama.
CoLa dilaksanakan sebagai pemalam Codon dan, oleh itu, disertakan dengan perpustakaan primitif mampatan, serta set saluran CIR dan LLVM yang mengoptimumkan rutin penciptaan dan akses. CoLa juga memudahkan operasi pengindeksan dan pengurangan biasa menggunakan sintaks akses struktur data tersuai dan pengendali yang disediakan oleh Codon.
Pada asasnya, kodon ialah rangka kerja yang boleh dikonfigurasikan domain untuk mereka bentuk dan melaksanakan DSL dengan pantas. Dengan menggunakan algoritma semakan jenis khusus dan algoritma IR dwiarah baharu, kod dinamik dalam pelbagai kawasan boleh dipermudahkan untuk dioptimumkan. Berbanding dengan menggunakan Python secara langsung, Codon boleh memadankan prestasi C/C++ tanpa mengorbankan kesederhanaan peringkat tinggi.
Pada masa ini, Codon mempunyai beberapa ciri Python yang tidak disokong, terutamanya termasuk polimorfisme masa jalan, pantulan masa jalan dan operasi jenis (contohnya, pengubahsuaian jadual kaedah dinamik, penambahan dinamik ahli kelas, metaclass dan penghias kelas), terdapat juga jurang dalam liputan perpustakaan Python standard. Walaupun Python yang disusun oleh Codon boleh wujud sebagai penyelesaian yang terhad, ia patut diberi perhatian.
[Bahan rujukan dan bacaan berkaitan]
Atas ialah kandungan terperinci Pengoptimuman prestasi Python dari perspektif pengkompil. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!