this question का जवाब देते समय (और एक ही प्रश्न के लिए this answer पढ़कर), मैंने सोचा कि मुझे पता था कि पाइथन कैश कैसे regexes।क्यों असम्पीडित हैं, बार-बार रीजिक्स का उपयोग पायथन 3 में इतना धीमा है?
लेकिन फिर मैंने सोचा कि मैं यह परीक्षण करना चाहते हैं, दो स्थितियों की तुलना:
- एक सरल regex की एक एकल संकलन, तो 10 कि संकलित regex के अनुप्रयोगों।
- एक असम्पीडित रेगेक्स के 10 अनुप्रयोग (जहां मुझे थोड़ा खराब प्रदर्शन की उम्मीद होगी क्योंकि रेगेक्स को एक बार संकलित करना होगा, फिर कैश किया जाएगा, और उसके बाद 9 बार कैश में देखा जाएगा)।
हालांकि, परिणाम (अजगर 3.3 में) चक्कर गया:
>>> import timeit
>>> timeit.timeit(setup="import re",
... stmt='r=re.compile(r"\w+")\nfor i in range(10):\n r.search(" jkdhf ")')
18.547793477671938
>>> timeit.timeit(setup="import re",
... stmt='for i in range(10):\n re.search(r"\w+"," jkdhf ")')
106.47892003890324
है कि 5.7 गुना धीमी! पायथन 2.7 में, अभी भी 2.5 के कारक में वृद्धि हुई है, जो कि मुझे उम्मीद से भी अधिक है।
क्या पाइथन 2 और 3 के बीच रेगेक्स का कैशिंग बदल गया है? The docs ऐसा सुझाव नहीं लगता है।
उम, आप इस तरह 'टाइमिट' का उपयोग क्यों कर रहे हैं? क्यों नहीं 'stmt =' re.search (...) ''/'stmt='r.search (...)' 'और' setup.com 'में' re.compile 'जोड़ें? – delnan
फैंसी 'functools.lru_cache' यहां मुद्दा है, यह कैशिंग परिवर्तन है जिसके बाद आप हैं। यह भी देखें http://bugs.python.org/issue16389 – mmgp
@ डेलनान: मैं चाहता था कि रेगेक्स का संकलन समय का हिस्सा बन जाए। –