Python का AI, डेटा विश्लेषण आदि में बहुत उपयोग होता है और इससे तेज़ी से कोड लिखा जा सकता है, लेकिन interpreter language होने की वजह से इसकी पुरानी speed समस्या व्यावहारिक काम में अक्सर सिरदर्द भी बन जाती है.

व्यावहारिक माहौल में Python की speed समस्या सुधारने के लिए कई तरह के विकल्पों पर विचार किया जाता है. कभी Python कोड को सिर्फ शुरुआती prototype के लिए इस्तेमाल किया जाता है, और production में जाते समय उसे Rust या C/C++ में फिर से विकसित किया जाता है.

मैं Python को छोड़े बिना speed समस्या हल करने के लिए एक नए विकल्प के रूप में Rextio नाम का एक टूल प्रयोगात्मक रूप से विकसित कर रहा हूँ.

मूल concept यह है कि Python कोड के उन हिस्सों को जो native में बदले जा सकते हैं (जैसे type hinting वाले static code), अपने-आप Rust कोड में बदलकर binary के रूप में compile किया जाए ताकि performance बढ़े, और जिन हिस्सों को अपने-आप native में बदलना कठिन है (जैसे dynamic code), उन्हें वैसे ही Python code के रूप में छोड़ दिया जाए (fallback) ताकि वे CPython पर चलें और मूल Python code की logic सुरक्षित रहे.

मोटे तौर पर प्रवाह इस प्रकार है.

type किए गए Python project
-> समर्थित native candidate का analysis
-> unsafe या unsupported function को reject
-> स्वीकार किए गए function के लिए Rust + PyO3 generate
-> बाकी के लिए Python fallback wrapper generate
-> import-compatible artifact build

विस्तृत जानकारी के लिए linked Git repository के दस्तावेज़ देखें.

Rextio से बदले गए native binary को शामिल करके चलाने और मूल Python code को CPython पर चलाने की तुलना करने पर performance improvement भी देखा जा सकता है.

  • बुनियादी Python code को native में बदलकर चलाने पर: 57.73×
  • NumPy को native में बदलकर चलाने पर: 2.52×
  • NetworkX को native में बदलकर Dijkstra algorithm चलाने पर: 3.68×
  • pandas के Series.map को native में बदलकर चलाने पर: 66.14×
  • PyTorch deep MLP को native में बदलकर चलाने पर: 1.02× (मौजूदा Python package में C extension आदि के उपयोग के कारण speed improvement सीमित)
  • TensorFlow eager chain को native में बदलकर चलाने पर: 1.04× (मौजूदा Python package में C extension आदि के उपयोग के कारण speed improvement सीमित)

ऊपर के benchmark में इस्तेमाल किया गया source code और execution environment की जानकारी के लिए rextio-benchmark Git repository देखें.

जानकारी के लिए, Rextio में Python code को transform करके compile चलाने वाला एक Core CLI है, और उसके साथ ऐसे अतिरिक्त plugin भी जोड़े जा सकें, इसके लिए विकास किया जा रहा है जो अलग-अलग Python package को Rust code में बदलने के नियम परिभाषित करते हैं. फिलहाल NumPy आदि के कुछ plugin पहले से बनाए गए हैं (rextio-numpy, rextio-networkx, rextio-pandas, rextio-torch, rextio-tensorflow आदि), और ऊपर के benchmark परिणाम इन्हीं plugin का उपयोग करके प्राप्त किए गए हैं.

बेशक, Rextio अभी भी बहुत सुधार की ज़रूरत वाला शुरुआती project है, और हर स्थिति में Python code को Rust-आधारित native में compile करना performance improvement नहीं देता.

उदाहरण के लिए, अगर native हिस्से और CPython fallback हिस्से के बीच data exchange बहुत बार होता है, तो data के convert होकर boundary पार करने में उल्टा speed कम हो सकती है. हालांकि Rextio में ऐसे मामलों में उस हिस्से को native से गुज़ारे बिना पूरी तरह CPython पर fallback कराने की दिशा में काम किया गया है ताकि speed drop रोकी जा सके.

अब तक मैं इस पर अकेले काम करता रहा, लेकिन लगा कि अब यह कुछ हद तक आकार ले चुका है, इसलिए यहाँ परिचय दे रहा हूँ.

अगर आपके पास सवाल या राय/feedback हो, तो मैं पूरी कोशिश करूँगा कि जवाब दूँ और उसे शामिल करूँ.

धन्यवाद.

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.