2010-05-07 12 views
7

Similar सवाल अजगर में स्ट्रिंग संयोजन करने के लिए have been brought इसी subject पर (अच्छा गति वहाँ तुलना)। उम्मीद है कि यह प्रश्न अलग है और पाइथन 2.6 और 3.0 पर अपडेट किया गया है।स्पीड तरीकों से अधिक सुरक्षा अनुकूलता बनाम बनाम

अब तक मेरा मानना ​​है कि तेजी से और सबसे संगत विधि (अलग अजगर संस्करणों के अलावा) सादा सरल + संकेत है:

text = "whatever" + " you " + SAY 

लेकिन मैं सुनने और पढ़ने इसे सुरक्षित और/या उचित नहीं है रखने के लिए।

मुझे यह भी सुनिश्चित नहीं है कि स्ट्रिंग में हेरफेर करने के लिए कितने तरीके हैं! मैं केवल 4 के बारे में गिन सकता हूं: interpolation और इसके सभी उप-विकल्प जैसे % और format और फिर सरल हैं, join और +

अंत में, new approach to string formatting, जो format के साथ है, निश्चित रूप से % को आगे संगतता के लिए अच्छा नहीं होने पर पिछली संगतता के लिए अच्छा नहीं है। लेकिन क्या हर स्ट्रिंग मैनिप्ल्यूशन के लिए इसका इस्तेमाल किया जाना चाहिए, जिसमें प्रत्येक कॉन्सटेनेशन भी शामिल है, जब भी हम खुद को 3.x तक सीमित करते हैं?

अच्छा, शायद यह एक प्रश्न की तुलना में विकी से अधिक है, लेकिन मैं पर उत्तर देना चाहता हूं जो प्रत्येक स्ट्रिंग मैनिपुलेशन विधि का उचित उपयोग है। और जिसे आम तौर पर प्रत्येक फोकस के साथ दिमाग में इस्तेमाल किया जा सकता है (गति के लिए और सुरक्षा के लिए अनुकूलता के लिए सबसे अच्छा)।

धन्यवाद।

संपादित करें: मुझे यकीन नहीं है कि मुझे जवाब स्वीकार करना चाहिए यदि मुझे नहीं लगता कि यह वास्तव में प्रश्न का उत्तर देता है ... लेकिन मेरा मुद्दा यह है कि वे सभी 3 एक साथ उचित काम करते हैं।

डैनियल का सबसे अधिक वोट दिया गया जवाब वास्तव में वह है जिसे मैं स्वीकार करने के लिए पसंद करूंगा, अगर "नोट" के लिए नहीं। मैं से असहमत हूं "कंसटेनेशन स्ट्रिंग्स को जोड़ने के लिए + ऑपरेटर का सख्ती से उपयोग कर रहा है" क्योंकि, एक के लिए, join स्ट्रिंग कॉन्सटेनेशन भी करता है, और हम इसके लिए किसी भी मनमानी लाइब्रेरी का निर्माण कर सकते हैं।

सभी मौजूदा 3 उत्तरों मूल्यवान हैं और मुझे कुछ जवाब देने का जवाब देना होगा। जबकि कोई भी ऐसा करने के लिए स्वयंसेवक नहीं है, मुझे लगता है कि एक कम वोट चुनकर (लेकिन THC4k की तुलना में काफी व्यापक है, जो कि एक बड़ी और बहुत स्वागत की टिप्पणी की तरह है) मैं दूसरों पर भी ध्यान आकर्षित कर सकता हूं।

+0

आप कहाँ पढ़ रहे हैं कि '+' है "सुरक्षित और नहीं/या सलाह दी जाती?" –

+0

@ जॉन के लिए, नीचे दिए गए 2 उत्तरों को पढ़ें। वे दोनों '+' का उपयोग करके हतोत्साहित करते हैं। – cregox

+0

शायद मैं आपसे अलग-अलग 'सलाहकार' व्याख्या कर रहा था। किसी भी मामले में आपने लिखा था कि उत्तर लिखे जाने से पहले। इसके अलावा उत्तरों में से कोई भी इंगित नहीं करता है कि हाल ही के पायथन में '+ =' तेज कर दिया गया है। आप कहां पढ़ रहे हैं कि '+' सुरक्षित नहीं है? –

उत्तर

3

का उपयोग + ठीक है, लेकिन अगर यह स्वचालित है नहीं:

a + small + number + of + strings + "is pretty fast" 

लेकिन यह बहुत धीमी गति से हो सकता है:

s = '' 
for line in anything: 
    s += line 

उपयोग इस बजाय:

s = ''.join([line for line in anything]) 

वहाँ पेशेवरों और बनाम '%s%line' उपयोग + की विपक्ष कर रहे हैं - + का उपयोग कर यहाँ असफल हो जायेगी:

s = 'Error - unexpected string' + 42 

आप इसे एक अपवाद चुपचाप फेंक, या चाहते हैं या नहीं कुछ असामान्य कुछ आपके उपयोग पर निर्भर करता है।

+0

लेकिन क्या आप कह रहे हैं कि 'जॉइन' छोटे स्ट्रिंग के लिए भी '+' से बेहतर प्रदर्शन करता है? मुझे लगता है कि लगभग हर सॉफ्टवेयर में छोटे स्ट्रिंग्स कॉन्सटेनेशन के साथ कोड की लगभग हर पंक्ति होगी ... लेकिन लोगों को इस विषय के बारे में बात करते समय दूसरी तरफ बात करना प्रतीत होता है। – cregox

+6

's = '' .join ([किसी भी चीज़ में लाइन के लिए लाइन]) 'में एक व्यर्थ सूची बनाने के लिए एक व्यर्थ लूप है ->' s =' '। (कुछ भी)' –

+1

@ कवास, स्ट्रिंग की एक छोटी संख्या के लिए , कोई वास्तविक अंतर नहीं है। छोटे तारों की एक बड़ी संख्या (100 कहें) के लिए (जब अंतिम परिणाम एक बड़ी स्ट्रिंग है), जुड़ना तेज़ है। दोनों बहुत तेज होना चाहिए। पठनीयता अधिक महत्वपूर्ण है। – wisty

5

एक नोट के रूप में: सच में यह सब स्ट्रिंग निर्माण और न संयोजन, दर असल के बारे में है, के रूप में संयोजन सख्ती से + ऑपरेटर उपयोग कर रहा है एक साथ एक के बाद एक तार जोड़ लिए।

  • + (संयोजन) - आम तौर पर अक्षम लेकिन पढ़ने में आसान हो सकता है कुछ लोगों के लिए, केवल का उपयोग करते हैं पठनीयता प्राथमिकता है और (सरल स्क्रिप्ट, throwaway लिपियों, गैर प्रदर्शन गहन कोड)
  • प्रदर्शन नहीं है
  • join (तारों के अनुक्रम से एक स्ट्रिंग का निर्माण) - जब आपके पास एक सामान्य वर्ण का उपयोग करने में शामिल होने की आवश्यकता होती है तो स्ट्रिंग का अनुक्रम होता है (या कोई चरित्र नहीं है यदि आप खाली स्ट्रिंग '' का उपयोग करने के लिए खाली स्ट्रिंग का उपयोग करना चाहते हैं चालू)
  • % और format (प्रक्षेप) - मूल रूप से हर दूसरे आपरेशन, का उपयोग करना चाहिए जो भी इनमें से किसी एक का चयन उचित है जो ऑपरेटर/समारोह अजगर का कौन सा संस्करण कोड के जीवन भर के लिए समर्थन चाहते हैं (2 के लिए % का उपयोग के आधार पर उपयुक्त है .x और 3.x के लिए format)
+0

से समर्थित है, ठीक है, मेरा ध्यान यहां सम्मेलन के बारे में है, मैं नहीं करता हूं ' टी वास्तव में स्वरूपण तारों और सभी में जाना चाहता हूँ। लेकिन पर्याप्त है, 'प्रारूप' और '%' अन्य कार्यों के बारे में बात करते हुए, "निर्माण" कहना बेहतर होगा और मैंने उस शब्द को भी नहीं सोचा है। मुझे नहीं पता, आपको अभी भी लगता है कि अगर मैं शीर्षक बदलता हूं तो बेहतर होगा? – cregox

+0

संगतता गति के लिए, उस लिंक को देखें जो मैंने गति तुलना के लिए दिया था। आप चौंक जाएंगे।इसके अलावा, मैं वास्तव में यहां डिजाइन/पठनीयता पर चर्चा नहीं करना चाहता हूं। मुझे लगता है कि इस मामले में यह बहुत ही व्यक्तिपरक है। – cregox

4

तारों के लिए + के साथ समस्या कई अन्य भाषाओं में समान है: प्रत्येक बार जब आप स्ट्रिंग का विस्तार करते हैं, तो इसकी प्रतिलिपि बनाई जाती है। तो 100 सबस्ट्रिंग्स से एक स्ट्रिंग बनाने के लिए, पायथन 99 चरणों में से प्रत्येक की प्रतिलिपि बनाता है।

और वह कुछ समय लगता है:

# join 100 pretty short strings 
python -m timeit -s "s = ['pretty short'] * 100" "t = ''.join(s)" 
100000 loops, best of 3: 4.18 usec per loop 

# same thing, 6 times slower 
python -m timeit -s "s = ['pretty short'] * 100" "t = ''" "for x in s:" " t+=x" 
10000 loops, best of 3: 30 usec per loop 
+0

इस स्पष्टीकरण के लिए धन्यवाद! – cregox

संबंधित मुद्दे