HeadlinesBriefing favicon HeadlinesBriefing.com

تشغيل محللات JSON بلغة Rust في Python باستخدام PyO3

Hacker News •
×

في كل مرة تتحقق فيها من صحة البيانات باستخدام Pydantic v2، مكتبة التحقق من البيانات التي تلجأ إليها معظم تطبيقات Python، تقوم إضافة Rust بالعمل. جوهرها، pydantic-core، مبني باستخدام PyO3، نفس سلسلة الأدوات التي يستخدمها هذا المقال لكشف محلل JSON صغير بلغة Rust كحزمة Python.

إدخال كود Rust إلى Python يتطلب أربع خطوات: كتابة وحدة Rust عادية، التعليق عليها بماكرو PyO3، ترك maturin يقوم بتجميعها وتثبيتها، واستيراد النتيجة. تضيف #[pyfunction] و #[pymodule] الكود اللاصق، تحويلات الأنواع، وحساب المراجع. ثم يقوم Maturin بتجميع الكريت إلى مكتبة مشتركة وإسقاطها في بيئتك الافتراضية.

ينتج المحلل enum بسيط في Rust: Null، Boolean(bool)، Number(f64)، String(String)، Array(Vec<Json Value>)، أو Object(Hash Map<String, Json Value>). تعيد ماكرو سمة Rust كتابة الدالة التي تجلس عليها، مثل مزين Python. في مجموعة Python إلى Rust الخاصة بنا، يقضي الطلاب ستة أسابيع في كتابة محلل JSON من الصفر بلغة Rust، محلل رموز يدوي ومحلل تنازلي تكراري بدون serde، ثم كشفها لـ Python عبر PyO3. نسخة Josh تفوقت على وحدة C json في CPython في اختبارات حقيقية؛ نسخة Jochen تعمل بسرعة تصل إلى 3.5x أسرع من نسخة Python.

التنفيذ المرجعي العام هو النسخة النظيفة التي يبدأ منها الطلاب. parse_json<'py>(py: Python<'py>, input: &str) -> Py Result<Bound<'py, Py Any>> تعيد القيمة أو ترفع استثناء Python. في إصدارات Python التقليدية، يرتبط هذا الوصول بالاحتفاظ بـ GIL. يسلمك PyO3 إياه وتمرره أينما تلمس كائن Python.

الكيانات الرئيسية: الأشخاص: Josh، Jochen