स्ट्रिंग स्ट्रिंग क्लास जैसे पायथन स्ट्रिंग क्लास # में?


121

क्या पायथन में कुछ स्ट्रिंग क्लास है जैसे StringBuilderC #?


6
यह जावा स्ट्रिंगबफ़र के बराबर पायथन का डुप्लिकेट है । चेतावनी: यहाँ के उत्तर पुराने हैं और वास्तव में, भ्रामक हो गए हैं। उत्तर के लिए अन्य प्रश्न देखें जो आधुनिक पायथन संस्करणों के लिए अधिक प्रासंगिक हैं (निश्चित रूप से 2.7 और ऊपर)।
जीन-फ्रांकोइस कॉर्बेट

जवाबों:


102

एक-से-एक सहसंबंध नहीं है। वास्तव में अच्छे लेख के लिए पाइथन में कुशल स्ट्रिंग कांसेप्टेशन देखें :

पायथन प्रोगामिंग भाषा में लंबे तार का निर्माण कभी-कभी बहुत धीमी गति से चलने वाले कोड में हो सकता है। इस लेख में मैं विभिन्न स्ट्रिंग संघनन विधियों के कम्प्यूटेशनल प्रदर्शन की जांच करता हूं।


27
ध्यान दें कि यह लेख पायथन 2.2 पर आधारित था। संभवत: परीक्षण पायथन के एक आधुनिक संस्करण में कुछ अलग तरीके से सामने आएंगे (CPython आमतौर पर सफलतापूर्वक संघनन का अनुकूलन करता है, लेकिन आप महत्वपूर्ण कोड में इस पर निर्भर नहीं होना चाहते हैं) और एक जनरेटर अभिव्यक्ति जहां वह एक सूची का उपयोग करता है, विचार के योग्य होगा। ।
माइक ग्राहम

4
उस लेख में कुछ हाइलाइट्स में खींचना अच्छा होगा, कम से कम कार्यान्वयन के एक जोड़े (लिंक सड़न समस्याओं से बचने के लिए)।
jpmc26

3
विधि 1: resultString + = appendString @ एंटोनी-
ट्रान

5
आपका उद्धरण सवाल का जवाब नहीं देता है। नए दिशानिर्देशों का पालन करने के लिए कृपया अपने उत्तर में संबंधित भागों को शामिल करें।
निधि मोनिका का मुकदमा

27

मैंने ओलिवर क्रो (एंड्रयू हरे द्वारा दिए गए लिंक) के कोड का उपयोग किया है और इसे दर्जी पायथन 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

यह बहुत स्पष्ट है कि स्ट्रिंग के अनुकूलन को अनुकूलित करने के लिए पायथन के लोगों ने बहुत अच्छा काम किया है, और जैसा कि होरे ने कहा: "समय से पहले अनुकूलन सभी बुराई की जड़ है" :-)


2
जाहिर तौर पर होरे इस बात को स्वीकार नहीं करते हैं: hans.gerwitz.com/2004/08/12/…
Pimin Konstantin Kefaloukos

5
यह नाजुक, दुभाषिया पर निर्भर अनुकूलन से बचने के लिए समय से पहले का अनुकूलन नहीं है। यदि आप कभी भी PyPy को पोर्ट करना चाहते हैं या अनुकूलन के लिए कई सूक्ष्म विफलता मामलों में से एक को मारना चाहते हैं, तो चीजों को सही तरीके से करें।
विड्राक

1
लगता है कि कंपाइलर ऑप्टिमाइज़ करने के लिए मेथड 1 आसान है।
mbomb007

25

संकलक अनुकूलन पर भरोसा नाजुक है। एंटोनी-ट्रान द्वारा दिए गए स्वीकृत उत्तर और संख्याओं से जुड़े बेंचमार्क पर भरोसा नहीं किया जाना चाहिए। एंड्रयू हरे 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कॉल रनटाइम पर हावी है, लेकिन गलती को व्यक्तिगत बनाने की कोई आवश्यकता नहीं है।
एलेक्स रिंकिंग

3
@AlexReinking के लिए खेद है, कुछ भी व्यक्तिगत मतलब नहीं है। मुझे यकीन नहीं है कि आपको क्या लगता है कि यह व्यक्तिगत था। लेकिन अगर यह उनके नामों का उपयोग था, तो मैंने उन का उपयोग केवल उपयोगकर्ता के उत्तर (उपयोगकर्ता नाम से मेल खाने के लिए किया है, निश्चित नहीं है कि अगर कोई बेहतर तरीका है)।
ग्रांट

1
अच्छा समय उदाहरण है कि डेटा आरंभीकरण और
संघनन के

19

पायथन में कई चीजें हैं जो समान उद्देश्यों को पूरा करती हैं:

  • टुकड़ों से बड़े तार बनाने का एक सामान्य तरीका यह है कि तार की एक सूची विकसित की जाए और जब आप कर रहे हों तो इसमें शामिल हो जाएं। यह अक्सर इस्तेमाल किया जाने वाला पायथन मुहावरा है।
    • स्वरूपण के साथ डेटा को शामिल करने वाले तार बनाने के लिए, आप स्वरूपण अलग से करेंगे।
  • एक चरित्र स्तर पर प्रविष्टि और विलोपन के लिए, आप लंबाई-एक तार की एक सूची रखेंगे। (इसे स्ट्रिंग से बनाने के लिए, आप कॉल करेंगे list(your_string)। आप इसके UserString.MutableStringलिए उपयोग भी कर सकते हैं ।
  • (c)StringIO.StringIO उन चीजों के लिए उपयोगी है जो अन्यथा एक फ़ाइल लेती हैं, लेकिन सामान्य स्ट्रिंग बिल्डिंग के लिए कम है।

10

ऊपर से विधि 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


-1

कोई स्पष्ट एनालॉग नहीं है - मुझे लगता है कि आपको स्ट्रिंग कॉन्टेनेशन्स (पहले कहे अनुसार अनुकूलित) या तीसरे पक्ष के वर्ग का उपयोग करने की उम्मीद है (मुझे संदेह है कि वे बहुत अधिक कुशल हैं - अजगर में सूचियां गतिशील-टाइप की जाती हैं इसलिए कोई तेजी से काम नहीं कर रहा है चार [] बफर के लिए के रूप में मैं मान)। कई भाषाओं (अपरिवर्तनीयता) में स्ट्रिंग की जन्मजात विशेषता के कारण स्ट्रिंगरगार्ड जैसी कक्षाएं समय से पहले अनुकूलन नहीं हैं - जो कई अनुकूलन (उदाहरण के लिए, स्लाइस / सबस्ट्रिंग के लिए एक ही बफर को संदर्भित करने की अनुमति देता है)। स्ट्रिंगरबिल्डर / स्ट्रैबफ़र / स्ट्रीपस्टार जैसी कक्षाएं, स्ट्रेंथनिंग स्ट्रिंग्स की तुलना में बहुत तेज़ी से काम करती हैं (कई छोटी अस्थायी वस्तुओं का निर्माण करना, जिन्हें अभी भी आवंटन और कचरा संग्रह की आवश्यकता होती है) और यहां तक ​​कि स्ट्रिंग फॉर्मेटिंग प्रिंटफ-जैसे टूल, स्वरूपण पैटर्न ओवरहेड की व्याख्या करने की आवश्यकता नहीं है जो कि बहुत अधिक खपत होती है। बहुत सारे प्रारूप कॉल।


-4

यदि आप यहां पाइथन में एक तेज़ स्ट्रिंग कॉन्सेटैनेशन विधि की तलाश कर रहे हैं, तो आपको एक विशेष स्ट्रिंगबर्स्ट क्लास की आवश्यकता नहीं है। सिंपल कॉन्टेनेशन C # में देखे गए परफॉरमेंस पेनल्टी के बिना ही काम करता है।

resultString = ""

resultString += "Append 1"
resultString += "Append 2"

प्रदर्शन परिणामों के लिए एंटोनी-ट्रान का उत्तर देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.