के लिए अलग से रन बनाम मैं एक काफी बड़े स्ट्रिंग (~ 700k) जिसके खिलाफ मैं 10 regexes चलाने के लिए और regexes से किसी के सभी मैचों की गिनती करने की जरूरत मिल गया है। मेरा त्वरित और गंदे प्रत्यारोपण कुछ ऐसा करना था जैसे re.search ('(expr1) | (expr2) | ...'), लेकिन मैं सोच रहा था कि क्या हम इसके बजाय लूप में मिलान करके कोई प्रदर्शन लाभ देखेंगे:regex '|' ऑपरेटर प्रत्येक उप अभिव्यक्ति
दूसरे शब्दों में, मैं के प्रदर्शन की तुलना करना चाहते हैं: मैं आलसी जा रहा है बंद कर देंगे
def CountMatchesInBigstring(bigstring, my_regexes):
"""Counts how many of the expressions in my_regexes match bigstring."""
count = 0
combined_expr = '|'.join(['(%s)' % r for r in my_regexes])
matches = re.search(combined_expr, bigstring)
if matches:
count += NumMatches(matches)
return count
बनाम
def CountMatchesInBigstring(bigstring, my_regexes):
"""Counts how many of the expressions in my_regexes match bigstring."""
count = 0
for reg in my_regexes:
matches = re.search(reg, bigstring)
if matches:
count += NumMatches(matches)
return count
और कुछ परीक्षण कल चलाने (और परिणाम पोस्ट), लेकिन मैंने सोचा क्या उत्तर किसी ऐसे व्यक्ति के लिए कूद जाएगा जो वास्तव में समझता है कि रीगेक्स कैसे काम करता है :)
चूंकि उनके उदाहरणों में प्रत्येक रेगेक्स का उपयोग केवल एक बार किया जाता है, आपको पूर्व-संकलन द्वारा कोई प्रदर्शन सुधार नहीं करना चाहिए। –
भले ही आपने प्रत्येक रेगेक्स को एक से अधिक बार इस्तेमाल किया हो, फिर भी पाइथन का री मॉड्यूल आपके लिए संकलित रेगेक्स को कैश करता है, इसलिए दूसरी बार में यह पूर्व-संकलित किसी भी तरह का उपयोग करेगा। – nosklo