टीएल; डीआर - आईएसएसयूई 21118
लंबी कहानी है
जोश रोसेनबर्ग ने पाया कि str.translate()
समारोह की तुलना में बहुत धीमी है bytes.translate
, उन्होंने कहा कि एक मुद्दा उठाया :
पायथन 3 में, str.translate()
आमतौर पर एक प्रदर्शन निराशा है, अनुकूलन नहीं।
क्यों था str.translate()
धीमी थी?
का मुख्य कारण str.translate()
बहुत धीमी गति से था कि लुकिंग पायथन डिक्शनरी में हुआ करता था।
maketrans
इस समस्या का उपयोग बदतर बना दिया। समान दृष्टिकोण का उपयोग करके bytes
फास्ट टेबल लुकअप के लिए 256 वस्तुओं के सी सरणी का निर्माण होता है। इसलिए उच्च स्तर के उपयोग अजगर dict
बना देता हैstr.translate()
अजगर 3.4 में बहुत धीमी गति से।
अब क्या हुआ?
पहला दृष्टिकोण एक छोटा पैच जोड़ना था, Translate_writer , हालांकि गति में वृद्धि उस मनभावन नहीं थी। जल्द ही एक और पैच fast_translate का परीक्षण किया गया और इसमें 55% तक स्पीडअप के बहुत अच्छे परिणाम मिले।
फ़ाइल से देखा जा सकता है कि मुख्य बदलाव यह है कि पायथन डिक्शनरी लुकअप को C लेवल लुकअप में बदल दिया जाता है।
गति अब लगभग समान हैं bytes
unpatched patched
str.translate 4.55125927699919 0.7898181750006188
str.translate from bytes trans 1.8910855210015143 0.779950579000797
यहां एक छोटा नोट यह है कि प्रदर्शन में वृद्धि केवल ASCII स्ट्रिंग्स में प्रमुख है।
जैसा कि JFSebastian ने एक टिप्पणी में उल्लेख किया है नीचे है, 3.5 से पहले, एएससीआईआई और गैर-एएससीआईआई दोनों मामलों के लिए अनुवाद एक ही तरह से काम करता था। हालांकि 3.5 ASCII मामले से बहुत तेज है।
पहले ASCII बनाम गैर-अस्की का उपयोग लगभग एक ही हुआ करता था, हालांकि अब हम प्रदर्शन में एक महान परिवर्तन देख सकते हैं।
जैसा कि इस उत्तर में देखा गया है यह 71.6μs से 2.33μs तक का सुधार हो सकता है ।
निम्न कोड यह प्रदर्शित करता है
python3.5 -m timeit -s "text = 'mJssissippi'*100; d=dict(J='i')" "text.translate(d)"
100000 loops, best of 3: 2.3 usec per loop
python3.5 -m timeit -s "text = 'm\U0001F602ssissippi'*100; d={'\U0001F602': 'i'}" "text.translate(d)"
10000 loops, best of 3: 117 usec per loop
python3 -m timeit -s "text = 'm\U0001F602ssissippi'*100; d={'\U0001F602': 'i'}" "text.translate(d)"
10000 loops, best of 3: 91.2 usec per loop
python3 -m timeit -s "text = 'mJssissippi'*100; d=dict(J='i')" "text.translate(d)"
10000 loops, best of 3: 101 usec per loop
परिणामों का सारणीकरण:
Python 3.4 Python 3.5
Ascii 91.2 2.3
Unicode 101 117
dict.fromkeys(ord(c) for c in '@#$')
:?