- HPy adalah API baru untuk memperluas Python dengan C
- Menggunakan
#include <hpy.h> alih-alih #include <Python.h>
Keunggulan HPy
- Zero overhead di CPython: Ekstensi yang ditulis dengan HPy berjalan secepat ekstensi "biasa"
- Lebih cepat di implementasi alternatif: Berjalan lebih cepat di PyPy, GraalPy, dan lainnya
- Biner universal: Ekstensi yang dibangun dengan HPy Universal ABI dapat dimuat tanpa modifikasi di CPython, PyPy, GraalPython, dan lainnya
- Jalur migrasi untuk dicampur dengan C-API lama: Panggilan C-API lama dan panggilan API HPy dapat dicampur. Setelah seluruh kode dimigrasikan, kode tersebut dapat dikompilasi menjadi biner universal yang bekerja di semua versi CPython, PyPy, atau GraalPy
- Mode debug: Mudah mengidentifikasi kebocoran memori, masa hidup objek yang salah, penggunaan API yang keliru, dan sebagainya
- API yang lebih baik: Mengatasi keterbatasan Python/C API standar, menghasilkan ekstensi yang lebih konsisten dan berkualitas lebih baik, serta dirancang agar bug lebih sulit terjadi
- Kemampuan untuk berevolusi: Seperti diringkas dengan baik dalam PEP 620, Python/C API standar mengekspos banyak detail implementasi internal sehingga evolusi C API menjadi sulit. HPy menyembunyikan semua detail implementasi internal sehingga tidak mengalami masalah ini
Status saat ini
- HPy sedang dikembangkan secara aktif. 0.9.0 adalah rilis alfa terbaru, tetapi akan segera keluar dari status alfa dan sedang diupayakan menuju rilis stabil
- ABI HPy kini dirasa cukup stabil sehingga janji kompatibilitas biner ke belakang dan ke depan dapat dipenuhi pada rilis mendatang
- API kini dianggap sudah mencakup cukup banyak use case untuk memigrasikan paket-paket penting, khususnya lihat port numpy
- Juga tersedia panduan porting dan dokumentasi yang luas, khususnya referensi API
- Selalu terbuka untuk diskusi desain dan kebutuhan baru
Ekstensi yang kompatibel dengan HPy
- ultrajson-hpy: Modul nyata pertama yang di-port ke HPy
- piconumpy: Seperti namanya, modul minimal mirip numpy yang mendefinisikan tipe kustom
- numpy: Salah satu target ambisiusnya adalah mem-port numpy ke HPy dan menggunakan pengalaman ini untuk lebih memahami cara merancang API. Port ini hampir lulus test suite
- matplotlib: Karena juga bergantung pada NumPy, migrasi ke mode universal belum sepenuhnya selesai. HPy menyediakan API kompatibilitas lama agar fungsi C API lama tetap bisa dipanggil di HPy dan test suite dapat dijalankan dengan sukses
- kiwi-solver: Dependensi Matplotlib yang telah sepenuhnya di-port ke mode universal
Opini GN⁺
- HPy adalah proyek yang sangat menjanjikan karena mengatasi keterbatasan Python/C API dan menawarkan skalabilitas serta portabilitas yang lebih baik
- Yang особенно menarik adalah besarnya potensi peningkatan performa pada implementasi Python alternatif seperti PyPy dan GraalPy
- Migrasi dari C API lama bisa jadi sulit, tetapi HPy menyediakan jalur migrasi bertahap yang membuat proses ini jauh lebih mudah dikelola
- Saat mengadopsi HPy, perlu mempertimbangkan integrasi dengan sistem build dan pipeline distribusi yang ada, penerimaan dari proyek upstream, serta tingkat kematangan dan stabilitas HPy itu sendiri
- Proyek lain dengan tujuan serupa HPy antara lain Cython dan PyO3 dari Rust. Keduanya berbeda dari HPy karena menggunakan bahasa tingkat tinggi alih-alih C API tingkat rendah
1 komentar
Komentar Hacker News
Bagian yang paling merepotkan dalam bekerja dengan C API adalah mengatur flag kompilasi/link.
python3-confighanya bekerja di level OS, dan sulit digunakan untuk mengakses paket yang dipasang lewat pip.python3 -m venvtidak membuat skrip semacam ini, dan anaconda/miniconda juga bermasalah. Tiap paket mencemari skrip build dengan pemanggilan hardcodedpython3 -c "import sys: print...". Saya telah membuka PR untuk menambahkan flagpython3 -m sysconfig --jsonke CPythonFakta bahwa bahasa Python terlalu terpusat pada satu implementasi bisa menjadi ancaman bagi keberhasilan jangka panjangnya. Web server, program baris perintah, dan perangkat tertanam memiliki kebutuhan yang berbeda. Jika proyek ini berhasil menggantikan C API Python dengan sesuatu yang tidak mengekspos detail implementasi, maka memelihara implementasi alternatif dan bereksperimen dengan teknologi baru bisa menjadi lebih mudah
Saya penasaran apakah proyek ini menyediakan binding Python yang independen dari versi. Saat ini kami membangun binding secara terpisah untuk setiap versi, dan ini menghabiskan banyak waktu CI/CD
Benchmark yang membandingkan ekstensi HPy dengan implementasi Cython/pybind11 dari sisi performa dan waktu pengembangan akan menarik
Tidak jelas bagaimana proyek ini berhubungan dengan library seperti PyBind11 atau nanobind. Sepertinya perlu ditulis ulang agar bisa digunakan dengan cara yang sama seperti library-library tersebut
Saya penasaran seberapa banyak ekstensi baru yang belakangan ini ditulis dalam C. Saya kira kebanyakan memakai Boost Python, pybind, PyO3, dan sejenisnya
Saya sering memposting tentang mengimplementasikan binding CPython dengan overhead minimal, dan ingin membagikan beberapa rekomendasi, pertanyaan, serta kekhawatiran. Akan bagus jika landing page proyek HPy dan README di repositorinya disusun ulang. Jika ada statistik dukungan untuk PyPy, GraalPython, dan runtime Python lainnya, itu akan lebih meyakinkan
Menggunakan objek konteks yang dienkapsulasi seperti
HPyContextberguna untuk masa depan Python multithread atau lingkungan yang kompleks. Namun, jikaHPyContextdialihkan ke singleton milik CPython, maka itu tidak menyelesaikan masalahBenchmark dari 2019 menyebut aturan pemanggilan
METH_FASTCALLmilik CPython, tetapi tidak membandingkannya. Jika peduli pada performa, lebih baik mem-parsing argumen langsung dari tuple tanpa string formatterSaya penasaran apakah di Python ada sesuatu yang sederhana seperti ffi milik luajit, yang memungkinkan pemberian header C dan pemuatan shared library agar struct bisa digunakan dan fungsi bisa dipanggil
Saya tertarik memanggil Go dari Python, dan gopy menghasilkan binding Python untuk cgo. HPy<->cgo mungkin bisa memiliki overhead yang lebih kecil
Coba bayangkan betapa berbedanya ekosistem Python jika pekerjaan ini sudah selesai 20 tahun yang lalu