आप नियमित अभिव्यक्ति के रूप में कीवर्ड की अपनी सूची बनाकर मामलों में सुधार करने में सक्षम हो सकते हैं।
यह उन्हें समानांतर में परीक्षण करने की अनुमति दे सकता है, लेकिन कीवर्ड पर क्या निर्भर करेगा (उदाहरण के लिए। कुछ काम शुरू करने से प्रत्येक वाक्यांश को खोजने के बजाय "हैलो" और "नरक" के लिए परीक्षण का पुन: उपयोग किया जा सकता है । प्रत्येक शब्द
के लिए आप को क्रियान्वित करते हुए ऐसा कर सकता है:
import re
keyword_re = re.compile("|".join(map(re.escape, keywords)))
तब:
>>> bool(keyword_re.search('hello, world'))
True
>>> bool(keyword_re.search('hi, earth'))
False
(यह वास्तव में एक मैच वस्तु पाया पर वापस आ जाएगी, और कोई नहीं यदि नहीं मिला - यह उपयोगी हो सकता है यदि आपको पता होना चाहिए कि कौन सा कीवर्ड मिलान किया गया है)
हालांकि, यह लाभ कितना (यदि कुछ भी हो) तो आप कीवर्ड पर निर्भर करेंगे। यदि आपके पास केवल एक या दो है, तो अपना वर्तमान दृष्टिकोण रखें। यदि आपके पास बड़ी सूची है, तो यह बेहतर प्रदर्शन करने के लिए यह देखने और प्रोफाइलिंग के लायक हो सकता है।
[संपादित करें] संदर्भ के लिए, दृष्टिकोण आपके उदाहरण के लिए करना बताया गया है:
good1 good2 good3 bad1 bad2
original : 0.206 0.233 0.229 0.390 63.879
gnud (join) : 0.257 0.347 4.600 0.281 6.706
regex : 0.766 1.018 0.397 0.764 124.351
regex (join) : 0.345 0.337 3.305 0.481 48.666
जाहिर है इस मामले के लिए
, अपने दृष्टिकोण दूर regex एक से बेहतर प्रदर्शन करती है। चाहे यह हमेशा मामला होगा, कीवर्ड की संख्या और जटिलता, और इनपुट डेटा की जांच की जाएगी। बड़ी संख्या में कीवर्ड, और लंबी सूचियों या शायद ही मिलान करने वाले वाक्यांशों के लिए, regexes बेहतर काम कर सकते हैं, लेकिन समय की जानकारी प्राप्त करें, और शायद पहले भी सरल अनुकूलन (जैसे कि आपकी कीवर्ड सूची के सामने सबसे आम शब्दों को स्थानांतरित करना) को आजमाएं। कभी-कभी सबसे सरल दृष्टिकोण वास्तव में सबसे अच्छा होता है।
[संपादित करें]gnud's solution के साथ तालिका अपडेट की गई, और रेगेक्स लागू करने से पहले एक समान दृष्टिकोण।
good_data3 = good_data2 * 500 # 1000 items, the first of which matches.
bad_data2 = bad_data * 500 # 1000 items, none of which matches.
जो विभिन्न शक्तियों और कमजोरियों दिखाई देते हैं: मैं भी 2 नए परीक्षण गयी।जब एक मैच तुरंत मिल जाएगा तो इसमें शामिल होना और भी खराब होता है (क्योंकि सूची में शामिल होने के लिए हमेशा भुगतान किया जाता है, यह रैखिक खोज विधि के लिए सबसे अच्छा संभव मामला है), हालांकि गैर मिलान वाली सूचियों के लिए, यह निष्पादित करता है बेहतर। अधिक बेहतर होता है जब list.case में बड़ी संख्या में आइटम होते हैं)।
अच्छा समाधान, मैं बिल्कुल यही सोच रहा था। यह regexes की तुलना में बहुत तेज़ होना चाहिए, क्योंकि __contains__ चेक संशोधित बॉयर-मूर के साथ किया जाता है और इस प्रकार विभाजक वर्णों पर अच्छी तरह से छोड़ना चाहिए। –
अच्छा विचार है, और इसमें बड़ी सूचियों पर * बहुत * संकेतक प्रभाव पड़ता है - शायद टॉर्स्टन ने कहा क्योंकि पाइथन उन खोज तालिकाओं का पुन: उपयोग कर सकता है जो उन्हें फेंकने और उन्हें प्रत्येक सूची आइटम के लिए पुनर्निर्माण करने के बजाय बनाता है। मैं अपने समय के आंकड़े अपडेट करूंगा। – Brian
सरणी में शामिल होना एक अच्छा विचार है! मैंने किसी भी() फ़ंक्शन पर एसएलॉट के सुझाव के साथ कॉम्बो में इसका उपयोग करने का निर्णय लिया। धन्यवाद! –