HeadlinesBriefing favicon HeadlinesBriefing.com

PyO3 के साथ Python में Rust JSON पार्सर चलाना

Hacker News •
×

हर बार जब आप Pydantic v2 के साथ डेटा मान्य करते हैं - वह डेटा-सत्यापन लाइब्रेरी जिसका अधिकांश Python ऐप्स उपयोग करते हैं - एक Rust एक्सटेंशन काम करता है। इसका कोर, pydantic-core, PyO3 के साथ बनाया गया है, वही टूलचेन जिसका उपयोग यह पोस्ट एक छोटे Rust JSON पार्सर को Python पैकेज के रूप में उजागर करने के लिए करता है।

Rust कोड को Python में लाने में चार चरण लगते हैं: एक सामान्य Rust मॉड्यूल लिखें, इसे PyO3 मैक्रोज़ के साथ एनोटेट करें, maturin को इसे संकलित और इंस्टॉल करने दें, और परिणाम आयात करें। #[pyfunction] और #[pymodule] ग्लू, प्रकार रूपांतरण, और संदर्भ गिनती जोड़ते हैं। Maturin फिर क्रेट को एक साझा लाइब्रेरी में संकलित करता है और इसे आपके वर्चुअल वातावरण में डालता है।

पार्सर एक सादा Rust एनम उत्पन्न करता है: Null, Boolean(bool), Number(f64), String(String), Array(Vec<Json Value>), या Object(Hash Map<String, Json Value>)। एक Rust विशेषता मैक्रो उस फ़ंक्शन को फिर से लिखता है जिस पर यह बैठता है, जैसे एक Python डेकोरेटर। हमारे Python से Rust कोहोर्ट में, छात्र छह सप्ताह Rust में स्क्रैच से एक JSON पार्सर लिखने में बिताते हैं, एक हाथ से बना टोकनाइज़र और पुनरावर्ती-वंश पार्सर बिना serde के, फिर PyO3 के माध्यम से इसे Python में उजागर करते हैं। Josh का संस्करण वास्तविक-विश्व फिक्स्चर पर CPython के C json मॉड्यूल को हराता है; Jochen का संस्करण Python संस्करण से 3.5x तक तेज़ चलता है।

सार्वजनिक संदर्भ कार्यान्वयन वह साफ संस्करण है जिससे छात्र शुरू करते हैं। parse_json<'py>(py: Python<'py>, input: &str) -> Py Result<Bound<'py, Py Any>> मान लौटाता है या एक Python अपवाद उठाता है। पारंपरिक Python बिल्ड पर, यह एक्सेस GIL रखने से जुड़ा होता है। PyO3 इसे आपको सौंपता है और आप इसे जहां भी Python ऑब्जेक्ट को छूते हैं, पास करते हैं।

मुख्य संस्थाएं: लोग: Josh, Jochen