क्या पायथन में कुछ स्ट्रिंग क्लास है जैसे StringBuilderC #?
क्या पायथन में कुछ स्ट्रिंग क्लास है जैसे StringBuilderC #?
जवाबों:
एक-से-एक सहसंबंध नहीं है। वास्तव में अच्छे लेख के लिए पाइथन में कुशल स्ट्रिंग कांसेप्टेशन देखें :
पायथन प्रोगामिंग भाषा में लंबे तार का निर्माण कभी-कभी बहुत धीमी गति से चलने वाले कोड में हो सकता है। इस लेख में मैं विभिन्न स्ट्रिंग संघनन विधियों के कम्प्यूटेशनल प्रदर्शन की जांच करता हूं।
मैंने ओलिवर क्रो (एंड्रयू हरे द्वारा दिए गए लिंक) के कोड का उपयोग किया है और इसे दर्जी पायथन 2.7.3 के लिए थोड़ा अनुकूलित किया है। (समय पैकेज का उपयोग करके)। मैं अपने निजी कंप्यूटर, लेनोवो T61, 6GB RAM, डेबियन GNU / Linux 6.0.6 (निचोड़) पर चला।
यहाँ 10,000 पुनरावृत्तियों के लिए परिणाम है:
Method1: 0.0538418292999 सेकंड प्रक्रिया का आकार 4800 केबी Method2: 0.22602891922 सेकंड प्रक्रिया का आकार 4960 kb Method3: 0.0605459213257 सेकंड प्रक्रिया का आकार 4980 kb Method4: 0.0544030666351 सेकंड प्रक्रिया का आकार 5536 kb Method5: 0.0551080703735 सेकंड प्रक्रिया का आकार 5272 kb Method6: 0.0542731285095 सेकंड प्रक्रिया का आकार 5512 kb
और 5,000,000 पुनरावृत्तियों के लिए (विधि 2 को अनदेखा कर दिया गया क्योंकि यह बहुत धीरे-धीरे चलता था, हमेशा की तरह):
Method1: 5.88603997231 सेकंड प्रक्रिया का आकार 37976 kb Method3: 8.40748500824 सेकंड प्रक्रिया का आकार 38024 kb Method4: 7.96380496025 सेकंड प्रक्रिया का आकार 321968 kb Method5: 8.03666186333 सेकंड प्रक्रिया का आकार 71720 केबी विधि 6: 6.68192911148 सेकेंड प्रक्रिया का आकार 38240 kb
यह बहुत स्पष्ट है कि स्ट्रिंग के अनुकूलन को अनुकूलित करने के लिए पायथन के लोगों ने बहुत अच्छा काम किया है, और जैसा कि होरे ने कहा: "समय से पहले अनुकूलन सभी बुराई की जड़ है" :-)
संकलक अनुकूलन पर भरोसा नाजुक है। एंटोनी-ट्रान द्वारा दिए गए स्वीकृत उत्तर और संख्याओं से जुड़े बेंचमार्क पर भरोसा नहीं किया जाना चाहिए। एंड्रयू हरे reprअपने तरीकों में एक कॉल शामिल करने की गलती करता है । यह सभी तरीकों को समान रूप से धीमा करता है लेकिन स्ट्रिंग के निर्माण में वास्तविक जुर्माना को अस्पष्ट करता है।
का उपयोग करें join। यह बहुत तेज और अधिक मजबूत है।
$ ipython3
Python 3.5.1 (default, Mar 2 2016, 03:38:02)
IPython 4.1.2 -- An enhanced Interactive Python.
In [1]: values = [str(num) for num in range(int(1e3))]
In [2]: %%timeit
...: ''.join(values)
...:
100000 loops, best of 3: 7.37 µs per loop
In [3]: %%timeit
...: result = ''
...: for value in values:
...: result += value
...:
10000 loops, best of 3: 82.8 µs per loop
In [4]: import io
In [5]: %%timeit
...: writer = io.StringIO()
...: for value in values:
...: writer.write(value)
...: writer.getvalue()
...:
10000 loops, best of 3: 81.8 µs per loop
reprकॉल रनटाइम पर हावी है, लेकिन गलती को व्यक्तिगत बनाने की कोई आवश्यकता नहीं है।
पायथन में कई चीजें हैं जो समान उद्देश्यों को पूरा करती हैं:
list(your_string)। आप इसके UserString.MutableStringलिए उपयोग भी कर सकते हैं ।(c)StringIO.StringIO उन चीजों के लिए उपयोगी है जो अन्यथा एक फ़ाइल लेती हैं, लेकिन सामान्य स्ट्रिंग बिल्डिंग के लिए कम है।ऊपर से विधि 5 का उपयोग करना (छद्म फ़ाइल) हम बहुत अच्छा पूर्ण और लचीलापन प्राप्त कर सकते हैं
from cStringIO import StringIO
class StringBuilder:
_file_str = None
def __init__(self):
self._file_str = StringIO()
def Append(self, str):
self._file_str.write(str)
def __str__(self):
return self._file_str.getvalue()
अब इसका उपयोग कर रहे हैं
sb = StringBuilder()
sb.Append("Hello\n")
sb.Append("World")
print sb
कोई स्पष्ट एनालॉग नहीं है - मुझे लगता है कि आपको स्ट्रिंग कॉन्टेनेशन्स (पहले कहे अनुसार अनुकूलित) या तीसरे पक्ष के वर्ग का उपयोग करने की उम्मीद है (मुझे संदेह है कि वे बहुत अधिक कुशल हैं - अजगर में सूचियां गतिशील-टाइप की जाती हैं इसलिए कोई तेजी से काम नहीं कर रहा है चार [] बफर के लिए के रूप में मैं मान)। कई भाषाओं (अपरिवर्तनीयता) में स्ट्रिंग की जन्मजात विशेषता के कारण स्ट्रिंगरगार्ड जैसी कक्षाएं समय से पहले अनुकूलन नहीं हैं - जो कई अनुकूलन (उदाहरण के लिए, स्लाइस / सबस्ट्रिंग के लिए एक ही बफर को संदर्भित करने की अनुमति देता है)। स्ट्रिंगरबिल्डर / स्ट्रैबफ़र / स्ट्रीपस्टार जैसी कक्षाएं, स्ट्रेंथनिंग स्ट्रिंग्स की तुलना में बहुत तेज़ी से काम करती हैं (कई छोटी अस्थायी वस्तुओं का निर्माण करना, जिन्हें अभी भी आवंटन और कचरा संग्रह की आवश्यकता होती है) और यहां तक कि स्ट्रिंग फॉर्मेटिंग प्रिंटफ-जैसे टूल, स्वरूपण पैटर्न ओवरहेड की व्याख्या करने की आवश्यकता नहीं है जो कि बहुत अधिक खपत होती है। बहुत सारे प्रारूप कॉल।
यदि आप यहां पाइथन में एक तेज़ स्ट्रिंग कॉन्सेटैनेशन विधि की तलाश कर रहे हैं, तो आपको एक विशेष स्ट्रिंगबर्स्ट क्लास की आवश्यकता नहीं है। सिंपल कॉन्टेनेशन C # में देखे गए परफॉरमेंस पेनल्टी के बिना ही काम करता है।
resultString = ""
resultString += "Append 1"
resultString += "Append 2"
प्रदर्शन परिणामों के लिए एंटोनी-ट्रान का उत्तर देखें