সি # তে স্ট্রিংবিল্ডারের মতো পাইথন স্ট্রিং ক্লাস?


121

পাইথনের মতো স্ট্রিং ক্লাস কি StringBuilderসি # এর মতো?


6
এটি জাভা স্ট্রিংবফারের সমকক্ষ পাইথনের প্রতিলিপি । সতর্কতা: এখানে উত্তরগুলি পুরানো এবং বাস্তবে বিভ্রান্তিকর হয়ে উঠেছে। আধুনিক পাইথন সংস্করণগুলির সাথে আরও প্রাসঙ্গিক উত্তরগুলির জন্য অন্যান্য প্রশ্নটি দেখুন (অবশ্যই ২.7 এবং উপরে)।
জিন-

উত্তর:


102

ওয়ান-টু ওয়ান পারস্পরিক সম্পর্ক নেই। সত্যিই একটি ভাল নিবন্ধের জন্য দয়া করে পাইথনে দক্ষ স্ট্রিং কনটেনটেশন দেখুন :

পাইথন প্রোগ্রামিং ল্যাঙ্গুয়েজে দীর্ঘ স্ট্রিং তৈরি করার ফলে অনেক সময় খুব ধীর চলমান কোডের ফলাফল আসতে পারে। এই নিবন্ধে আমি বিভিন্ন স্ট্রিং সংমিশ্রণ পদ্ধতিগুলির গণ্য কর্মক্ষমতা তদন্ত করি।


27
দ্রষ্টব্য যে নিবন্ধটি পাইথন ২.২ এর উপর ভিত্তি করে লেখা হয়েছিল। পাইথনের আধুনিক সংস্করণে পরীক্ষাগুলি কিছুটা আলাদাভাবে বেরিয়ে আসবে (সিপিথন সাধারণত সাফল্যের সাথে কনটেনটেশনকে অনুকূল করে তোলে তবে আপনি গুরুত্বপূর্ণ কোডে এটির উপর নির্ভর করতে চান না) এবং একটি জেনারেটর এক্সপ্রেশন যেখানে তিনি একটি তালিকা বোঝার জন্য ব্যবহার করেন তা বিবেচনার জন্য উপযুক্ত হবে ।
মাইক গ্রাহাম

4
এই নিবন্ধটির কয়েকটি হাইলাইটগুলি টেনে নেওয়া ভাল হবে, অন্ততপক্ষে বাস্তবায়নগুলির কয়েকটি (লিঙ্ক পচা সমস্যা এড়াতে)।
jpmc26

3
পদ্ধতি 1: ফলাফল স্ট্রিং + = অ্যাপেন্ডস্ট্রিং নীচে @ এন্টোইন-ট্রান দ্বারা পরীক্ষাগুলি অনুসারে দ্রুত
জাস্টাস

5
আপনার উক্তিটি প্রশ্নের কোনও উত্তর দেয় না। নতুন নির্দেশিকাগুলি মেনে চলার জন্য দয়া করে আপনার উত্তরটিতে প্রাসঙ্গিক অংশগুলি অন্তর্ভুক্ত করুন।
মনিকা এর মোকদ্দমা

27

আমি অলিভার ক্রের কোডটি ব্যবহার করেছি (অ্যান্ড্রু হারের দেওয়া লিঙ্ক) এবং এটি পাইথন ২..3.৩ এর সাথে কিছুটা মানিয়ে নিয়েছি। (টাইমিট প্যাকেজ ব্যবহার করে)। আমি আমার ব্যক্তিগত কম্পিউটার, লেনোভো টি 61১, GB জিবি র‌্যাম, দেবিয়ান জিএনইউ / লিনাক্স .0.০. ((স্কিজে) দৌড়েছি।

10,000 টি পুনরাবৃত্তির ফলাফল এখানে:

পদ্ধতি 1: 0.0538418292999 সেকেন্ড
প্রক্রিয়া আকার 4800 কেবি
পদ্ধতি 2: 0.22602891922 সেকেন্ড
প্রক্রিয়া আকার 4960 কেবি
পদ্ধতি 3: 0.0605459213257 সেকেন্ড
প্রক্রিয়া আকার 4980 কেবি
পদ্ধতি 4: 0.0544030666351 সেকেন্ড
প্রক্রিয়া আকার 5536 কেবি
পদ্ধতি 5: 0.0551080703735 সেকেন্ড
প্রক্রিয়া আকার 5272 কেবি
পদ্ধতি 6: 0.0542731285095 সেকেন্ড
প্রক্রিয়া আকার 5512 কেবি

এবং 5,000,000 পুনরাবৃত্তির জন্য (পদ্ধতি 2 উপেক্ষা করা হয়েছে কারণ এটি চিরতরের মতো ধীরে ধীরে চলেছে):

পদ্ধতি 1: 5.88603997231 সেকেন্ড
প্রক্রিয়া আকার 37976 কেবি
পদ্ধতি 3: 8.40748500824 সেকেন্ড
প্রক্রিয়া আকার 38024 কেবি
পদ্ধতি 4: 7.96380496025 সেকেন্ড
প্রক্রিয়া আকার 321968 কেবি
পদ্ধতি 5: 8.03666186333 সেকেন্ড
প্রক্রিয়া আকার 71720 কেবি
পদ্ধতি 6: 6.68192911148 সেকেন্ড
প্রক্রিয়া আকার 38240 কেবি

এটা একেবারেই স্পষ্ট যে পাইথন ছেলেরা স্ট্রিং কনটেনটেশনকে অনুকূলকরণ করতে দুর্দান্ত কাজ করেছে, এবং হোয়ের যেমন বলেছিলেন: "অকালীন অপটিমাইজেশন হ'ল সমস্ত দুষ্টের মূল" :-)


2
স্পষ্টতই হোরে তা গ্রহণ করে না: hans.gerwitz.com/2004/08/12/…
পিমন কনস্ট্যান্টিন কেফলালোকস

5
ভঙ্গুর, দোভাষী-নির্ভর অপ্টিমাইজেশান এড়ানোর জন্য এটি অকালিক অনুকূলতা নয়। আপনি যদি কখনও পাইপাইতে পোর্ট করতে চান বা অপ্টিমাইজেশনের জন্য সূক্ষ্ম ব্যর্থতার অনেকগুলি ক্ষেত্রে একটিকে ঝুঁকির ঝুঁকিপূর্ণ করেন , তবে সঠিক উপায়ে কাজ করুন।
Veedrac

1
মনে হচ্ছে কম্পাইলারটির জন্য অপটিমাইজ করা পদ্ধতিটি 1 টি সহজ।
mbomb007

24

সংকলক অপ্টিমাইজেশনের উপর নির্ভর করা ভঙ্গুর। এন্টোইন-ট্রান প্রদত্ত স্বীকৃত উত্তর এবং সংখ্যার সাথে যুক্ত বেঞ্চমার্কগুলি বিশ্বাসযোগ্য নয়। অ্যান্ড্রু হরে একটি কলকে অন্তর্ভুক্ত করার ভুল করে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
@ অ্যালেক্সরিকিং দুঃখিত, ব্যক্তিগত অর্থের কিছুই নেই। আমি নিশ্চিত না যে কী কারণে আপনি এটি ব্যক্তিগত মনে করেছেন। তবে যদি এটি তাদের নামের ব্যবহার হয় তবে আমি সেগুলি কেবল ব্যবহারকারীর উত্তরগুলি উল্লেখ করতে ব্যবহার করেছি (ব্যবহারকারীর নাম মেলে, আরও ভাল উপায় আছে কিনা তা নিশ্চিত নন)।
গ্রান্টজে


19

পাইথনের বেশ কয়েকটি জিনিস রয়েছে যা একই ধরনের উদ্দেশ্যগুলি পূরণ করে:

  • টুকরা থেকে বড় স্ট্রিং তৈরির একটি সাধারণ উপায় হ'ল স্ট্রিংগুলির একটি তালিকা বাড়ানো এবং আপনার কাজ শেষ হয়ে গেলে এটিতে যোগদান করা। এটি প্রায়শই ব্যবহৃত পাইথন আইডিয়াম।
    • ফর্ম্যাটিংয়ের সাথে ডেটা সংযুক্ত করে স্ট্রিংগুলি তৈরি করতে, আপনি আলাদাভাবে বিন্যাসটি করবেন would
  • একটি অক্ষর স্তরে সন্নিবেশ এবং মোছার জন্য, আপনি দৈর্ঘ্য এক স্ট্রিংয়ের একটি তালিকা রাখবেন। (কোনও স্ট্রিং থেকে এটি তৈরি করতে, আপনি কল list(your_string)করতে পারেন You এছাড়াও আপনি এটির জন্য একটি ব্যবহার করতে পারেন 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

যদি আপনি এখানে পাইথনে একটি দ্রুত স্ট্রিং সংক্ষেপণ পদ্ধতি সন্ধান করছেন তবে আপনার বিশেষ স্ট্রিংবিল্ডার শ্রেণির প্রয়োজন হবে না। সি # তে দেখা পারফরম্যান্স পেনাল্টি ছাড়াই সাধারণ কনটেক্সটেশন ঠিক পাশাপাশি কাজ করে।

resultString = ""

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

পারফরম্যান্স ফলাফলের জন্য এন্টোইন-ট্রান এর উত্তর দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.