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 enum তৈরি করে: 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