কম্পিউটার

রুবি স্ট্রিং 13 গুণ দ্রুত পরিষ্কার করা

আপনার চিন্তাভাবনাগুলিকে কোডে অনুবাদ করার সময়, সম্ভবত, আপনি সেই পদ্ধতিগুলি ব্যবহার করেন যা আপনি সবচেয়ে বেশি পরিচিত। এগুলি এমন পদ্ধতি যা মনের সেরা এবং স্বয়ংক্রিয়ভাবে আপনার কাছে আসে:আপনি একটি স্ট্রিং দেখতে পাচ্ছেন যা পরিষ্কার করা দরকার এবং আপনার আঙ্গুলগুলি সেই পদ্ধতিগুলি টাইপ করে যা ফলাফল পাবে৷

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

আমি বেশিরভাগই রুবির সমৃদ্ধ বাগধারাটি পছন্দ করি কারণ এটি কোডটিকে আরও মার্জিত এবং সহজ করে তোলে। আমরা যদি এই সমৃদ্ধি থেকে উপকৃত হতে চাই, তাহলে আমাদের কোডের সহজতম অংশগুলিকেও রিফ্যাক্টর করার জন্য সময় ব্যয় করতে হবে-উদাহরণস্বরূপ, একটি স্ট্রিং পরিষ্কার করা-এবং আমাদের শব্দভাণ্ডার প্রসারিত করার জন্য কিছুটা প্রচেষ্টা লাগে। প্রশ্ন হল:অতিরিক্ত প্রচেষ্টা কি মূল্যবান?

স্পেস অপসারণের চারটি উপায়

এখানে একটি স্ট্রিং রয়েছে যা একটি ক্রেডিট কার্ড নম্বর উপস্থাপন করে:"055 444 285"। এটির সাথে কাজ করার জন্য, আমরা স্পেসগুলি সরাতে চাই। #gsub এটা করতে পারেন; #gsub সহ আপনি সবকিছু দিয়ে কিছু প্রতিস্থাপন করতে পারেন। কিন্তু অন্যান্য বিকল্প আছে।

string = "055 444 285"
string.gsub(/ /, '')
string.gsub(' ', '')
string.tr(' ', '')
string.delete(' ')
 
# => "055444285"

এটি অভিব্যক্তি যা আমি সুবিধার পদ্ধতি সম্পর্কে সবচেয়ে পছন্দ করি। শেষটি এটির একটি ভাল উদাহরণ:এটি "স্পেস মুছুন" এর চেয়ে বেশি স্পষ্ট নয়। বিকল্পগুলির মধ্যে ট্রেড-অফ সম্পর্কে চিন্তা করা, পঠনযোগ্যতা আমার প্রথম অগ্রাধিকার, যদি না অবশ্যই, এটি কর্মক্ষমতা সমস্যা সৃষ্টি করে। তো, দেখা যাক কতটা কষ্ট আমার প্রিয় সমাধান, #delete সত্যিই কারণ।

আমি উপরে উদাহরণ বেঞ্চমার্ক. এই পদ্ধতিগুলির মধ্যে কোনটি আপনার কাছে দ্রুততম বলে মনে হয়?

Benchmark.ips do |x|
  x.config(time: 30, warmup: 2)
 
  x.report('gsub')           { string.gsub(/ /, '') }
  x.report('gsub, no regex') { string.gsub(' ', '') }
  x.report('tr')             { string.tr(' ','') }
  x.report('delete')         { string.delete(' ') }
 
  x.compare!
end
<বিস্তারিত>সারাংশ>অধিকাংশ থেকে সর্বনিম্ন পারফরম্যান্সের ক্রম অনুমান করুন। ফলাফল দেখতে টগল খুলুন
Comparison:
  delete:          2326817.5 i/s
  tr:              2121629.8 i/s   - 1.10x  slower
  gsub, no regex:  868184.1 i/s    - 2.68x  slower
  gsub:            474970.5 i/s    - 4.90x  slower

আমি অর্ডার সম্পর্কে বিস্মিত ছিলাম না, কিন্তু গতির পার্থক্য এখনও আমাকে অবাক করে। #gsub এটি কেবল ধীরগতির নয়, এটি পাঠকের আর্গুমেন্টগুলিকে 'ডিকোড' করার জন্য একটি অতিরিক্ত প্রচেষ্টারও প্রয়োজন৷ চলুন দেখি এই তুলনাটি কীভাবে কাজ করে যখন কেবলমাত্র স্থানের চেয়ে বেশি পরিষ্কার করা হয়।

আপনার নম্বর চয়ন করুন

নিম্নলিখিত ফোন নম্বর নিন:'(408) 974-2414' . ধরা যাক আমাদের শুধুমাত্র সংখ্যার প্রয়োজন => 4089742414 . আমি একটি #scan যোগ করেছি সেইসাথে আমি পছন্দ করি যে এটি আরও স্পষ্টভাবে প্রকাশ করে যে আমরা কিছু নির্দিষ্ট জিনিসের জন্য লক্ষ্য করি, আমরা যা চাই না তা সরিয়ে ফেলার চেষ্টা করার পরিবর্তে।

Benchmark.ips do |x|
  x.config(time: 30, warmup: 2)
 
  x.report ('gsub')           { string.gsub(/[^0-9] /, '') }
  x.report('tr')              { string.tr("^0-9", "") }
  x.report('delete_chars')    { string.delete("^0-9") }
  x.report('scan')            { string.scan(/[0-9]/).join }
  x.compare!
end
<বিস্তারিত>সারাংশ>আবার, অর্ডারটি অনুমান করুন, তারপর উত্তরটি দেখতে টগল খুলুন
Comparison:
  delete_chars:   2006750.8 i/s
  tr:             1856429.0 i/s   - 1.08x  slower
  gsub:           523174.7 i/s    - 3.84x  slower
  scan:           227717.4 i/s    - 8.81x  slower

একটি রেজেক্স ব্যবহার করা জিনিসগুলিকে ধীর করে দেয়, এটি আশ্চর্যজনক নয়। এবং #scan এর অভিব্যক্তি প্রকাশ করার উদ্দেশ্য আমাদের ব্যয়বহুল। কিন্তু রুবির বিশেষ পদ্ধতিগুলি কীভাবে পরিষ্কার করা হয় তা দেখে, আমাকে আরও কিছুর স্বাদ দিয়েছে।

অন দ্য মানি

চলুন "€ " সাবস্ট্রিং অপসারণের কিছু উপায় চেষ্টা করি "€ 300" স্ট্রিং থেকে . নিচের কিছু সমাধান সঠিক সাবস্ট্রিং "€ " নির্দিষ্ট করে , কিছু কেবল সমস্ত মুদ্রার চিহ্ন বা সমস্ত অ-সংখ্যাসূচক অক্ষর মুছে ফেলবে।

Benchmark.ips do |x|
  x.config(time: 30, warmup: 2)
 
  x.report('delete specific chars')  { string.delete("€ ") }
  x.report('delete non-numericals')  { string.delete("^0-9") }
  x.report('delete prefix')          { string.delete_prefix("€ ") }
  x.report('delete prefix, strip')   { string.delete_prefix("€").strip }
 
  x.report('gsub')                   { string.gsub(/€ /, '') }
  x.report('gsub-non-nums')          { string.gsub(/[^0-9]/, '') }
  x.report('tr')                     { string.tr("€ ", "") }
  x.report('slice array')            { string.chars.slice(2..-1).join }
  x.report('split')                  { string.split.last }
  x.report('scan nums')              { string.scan(/\d/).join }
  x.compare!
end

আপনি আশা করতে পারেন, এবং সঠিকভাবে, বিজয়ী হলেন একজন #delete s কিন্তু কোনটি #delete আপনি কি দ্রুততম হতে আশা করেন? প্লাস:অন্যান্য পদ্ধতিগুলির মধ্যে একটি হল কিছু #delete থেকে দ্রুত s কোনটি?

<বিস্তারিত>সারাংশ>অনুমান করুন এবং তারপর খুলুন।
Comparison:
        delete prefix:   4236218.6 i/s
 delete prefix, strip:   3116439.6 i/s - 1.36x  slower
                split:   2139602.2 i/s - 1.98x  slower
delete non-numericals:   1949754.0 i/s - 2.17x  slower
delete specific chars:   1045651.9 i/s - 4.05x  slower
                   tr:   951352.0 i/s  - 4.45x  slower
          slice array:   681196.2 i/s  - 6.22x  slower
                 gsub:   548588.3 i/s  - 7.72x  slower
        gsub-non-nums:   489744.8 i/s  - 8.65x  slower
            scan nums:   418978.8 i/s  - 10.11x  slower

আমি অবাক হয়ে গিয়েছিলাম যে এমনকি একটি অ্যারের স্লাইস করা #gsub এর চেয়ে দ্রুত এবং #split কত দ্রুত তা দেখে আমি সর্বদা খুশি হয় এবং মনে রাখবেন যে সমস্ত অ-সংখ্যা মুছে ফেলা একটি নির্দিষ্ট সাবস্ট্রিং মুছে ফেলার চেয়ে দ্রুত৷

অর্থ অনুসরণ করুন

সংখ্যার পর কারেন্সি মুছে ফেলি। (আমি ধীরগতির #gsub বাদ দিয়েছি ভেরিয়েন্ট।)

Benchmark.ips do |x|
  x.config(time: 30, warmup: 2)
 
  x.report('gsub')                        { string.gsub(/ USD/, '')
  x.report('tr')                          { string.tr(" USD", "") }
  x.report('delete_chars')                { string.delete("^0-9")
  x.report('delete_suffix')               { string.delete_suffix(" USD") }
  x.report('to_i.to_s')                   { string.to_i.to_s }
  x.report("split")                       { string.split.first }
  x.compare!
end

বিজয়ীদের মধ্যে একটি ড্র আছে। আপনি কোন 2টি দ্রুততম হওয়ার জন্য প্রতিদ্বন্দ্বিতা করতে চান?

<বিস্তারিত>সারাংশ>এবং:অনুমান করুন _কত_ ধীরগতির `#gsub` এখানে।
Comparison:
delete_suffix: 4354205.4 i/s
to_i.to_s: 4307614.6 i/s - same-ish: difference falls within error
split: 2870187.8 i/s - 1.52x slower
delete_chars: 1989566.1 i/s - 2.19x slower
tr: 1853957.1 i/s - 2.35x slower
gsub: 524080.6 i/s - 13.22x slower

সর্বদা একটি বিশেষ পদ্ধতি নেই যা আপনার প্রয়োজন অনুসারে হবে। আপনি #to_i ব্যবহার করতে পারবেন না আপনি যদি একটি অগ্রণী "0" রাখতে চান। এবং #delete_suffix মুদ্রাটি মার্কিন ডলার।

বিশেষ পদ্ধতিগুলি যথার্থ সরঞ্জামের মতো - একটি নির্দিষ্ট প্রসঙ্গে একটি নির্দিষ্ট কাজের জন্য উপযুক্ত। তাই সবসময় এমন কিছু ক্ষেত্রে থাকবে যেখানে #gsub আমাদের প্রয়োজন ঠিক কি. এটি বহুমুখী, এবং এটি সর্বদা মনের শীর্ষে থাকে। তবে এটি প্রক্রিয়া করা কিছুটা কঠিন হতে পারে এবং প্রায়শই ধীরগতির হয়, এমনকি আমার প্রত্যাশার চেয়েও ধীর। আমার কাছে, রুবির সমৃদ্ধিও একটি কারণ যা এটির সাথে কাজ করতে এত মজা করে। গতির জয় একটি চমৎকার বোনাস।


  1. রুবিতে কীভাবে র্যান্ডম নম্বর এবং স্ট্রিং তৈরি করবেন

  2. রুবি স্ট্রিং বিন্যাস

  3. রুবিতে পালানো চরিত্র

  4. জাভাতে স্ট্রিংগুলি কীভাবে তুলনা করবেন