:, मैं विपरीत लगता है
इस विशेष उदाहरण हैं जहां एक शाब्दिक स्ट्रिंग एक regex पैटर्न के बजाय प्रयोग किया जाता है, वास्तव में re.search
डिफ़ॉल्ट CPython कार्यान्वयन (मैं पायथन के अन्य रूपों में यह परीक्षण नहीं किया) के लिए re.match
की तुलना में थोड़ा तेज है।
>>> print timeit.timeit(stmt="r.match(s)",
... setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
... number = 10000000)
3.29107403755
>>> print timeit.timeit(stmt="r.search(s)",
... setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
... number = 10000000)
2.39184308052
C code behind those modules में देख रहे हैं, ऐसा लगता है खोज कोड एक अनुकूलन to quickly match patterns prefixed with a string lateral में निर्माण किया है। उपर्युक्त उदाहरण में, संपूर्ण पैटर्न एक शाब्दिक स्ट्रिंग है जिसमें कोई रेगेक्स पैटर्न नहीं है और इसलिए यह अनुकूलित दिनचर्या पूरे पैटर्न से मेल खाने के लिए उपयोग किया जाता है।
सूचना कैसे प्रदर्शन खराब हो के रूप में शाब्दिक स्ट्रिंग उपसर्ग कम हो जाता है एक बार हम regex प्रतीकों का परिचय और,:
>>> print timeit.timeit(stmt="r.search(s)",
... setup="import re; s = 'helloab'*100000; r = re.compile('hell.')",
... number = 10000000)
3.20765399933
>>>
>>> print timeit.timeit(stmt="r.search(s)",
... setup="import re; s = 'helloab'*100000; r = re.compile('hel.o')",
... number = 10000000)
3.31512498856
>>> print timeit.timeit(stmt="r.search(s)",
... setup="import re; s = 'helloab'*100000; r = re.compile('he.lo')",
... number = 10000000)
3.31983995438
>>> print timeit.timeit(stmt="r.search(s)",
... setup="import re; s = 'helloab'*100000; r = re.compile('h.llo')",
... number = 10000000)
3.39261603355
पैटर्न है कि regex पैटर्न होते हैं के भाग के लिए, SRE_MATCH मैचों निर्धारित करने के लिए प्रयोग किया जाता है। यह अनिवार्य रूप से re.match
के पीछे एक ही कोड है।
नोट करें कि परिणाम कैसे बंद होते हैं (re.match
थोड़ा तेज़ी से) यदि पैटर्न एक शाब्दिक स्ट्रिंग के बजाय रेगेक्स पैटर्न के साथ शुरू होता है।
>>> print timeit.timeit(stmt="r.match(s)",
... setup="import re; s = 'helloab'*100000; r = re.compile('.ello')",
... number = 10000000)
3.22782492638
>>> print timeit.timeit(stmt="r.search(s)",
... setup="import re; s = 'helloab'*100000; r = re.compile('.ello')",
... number = 10000000)
3.31773591042
दूसरे शब्दों में, इस तथ्य search
और match
विभिन्न प्रयोजनों है कि अनदेखी, re.search
re.match
की तुलना में तेजी केवल जब पैटर्न एक शाब्दिक स्ट्रिंग है।
बेशक, यदि आप शाब्दिक तारों के साथ काम कर रहे हैं, तो आप इसके बजाय स्ट्रिंग ऑपरेशंस का उपयोग करना बेहतर हो सकते हैं।
>>> # Detecting exact matches
>>> print timeit.timeit(stmt="s == r",
... setup="s = 'helloab'*100000; r = 'hello'",
... number = 10000000)
0.339027881622
>>> # Determine if string contains another string
>>> print timeit.timeit(stmt="s in r",
... setup="s = 'helloab'*100000; r = 'hello'",
... number = 10000000)
0.479326963425
>>> # detecting prefix
>>> print timeit.timeit(stmt="s.startswith(r)",
... setup="s = 'helloab'*100000; r = 'hello'",
... number = 10000000)
1.49393510818
>>> print timeit.timeit(stmt="s[:len(r)] == r",
... setup="s = 'helloab'*100000; r = 'hello'",
... number = 10000000)
1.21005606651
आपको वास्तव में 'सेटअप' पैरामीटर में 'टाइमिट' में टेस्ट स्ट्रिंग और रेगेक्स ऑब्जेक्ट बनाना चाहिए ताकि आप केवल मैच/खोज को माप सकें। और 10 से अधिक पुनरावृत्तियों को करें। – interjay
@interjay: इसे '10000' तक बढ़ा दिया गया। 'संख्या = 100000' का प्रयास किया लेकिन मेरी नेटबुक पर यह बहुत अधिक समय ले रहा था। – RanRag
... लेकिन आपने अन्य चीजों को नहीं किया जो मैंने कहा था, इसलिए आप अपने प्रश्न के लिए महत्वपूर्ण कुछ भी माप नहीं रहे हैं (अधिकांश समय स्ट्रिंग का निर्माण करने में व्यतीत होता है)। – interjay