루비에서 긴 반복 텍스트 문자열을 어떻게 생성합니까?


138

루비에서 긴 문자열을 빠르게 생성하는 가장 좋은 방법은 무엇입니까? 이것은 작동하지만 매우 느립니다.

str = ""
length = 100000
(1..length).each {|i| str += "0"}

또한 적절한 길이의 문자열을 만든 다음 기존 문자열에 원하는 길이까지 추가하면 훨씬 빠르게 작동한다는 것을 알았습니다.

str = ""
incrementor = ""
length = 100000
(1..1000).each {|i| incrementor += "0"}
(1..100).each {|i| str += incrementor}

다른 제안?


1
가장 좋은 방법은 JRuby를 사용하고 StringBuffer를 사용하는 것입니다. 오오 오오
Jonathan Feinberg

답변:


307
str = "0" * 999999

22
사실, 아주 이상한, 어떻게 보면 파이썬에서 다른 우아한 외모 : str = "0" * 999999)
tokland

1
Ruby에서 왜 순서가 중요합니까? 내가 할 때 99999 * "0"내가 얻을TypeError: String can't be coerced into Fixnum
스티븐

16
@Steven Ruby의 관점 에서 클래스 의 메소드가있는 위치 로 "0" * 999999취급됩니다 . 이 방법은 숫자를 유효한 인수로 받아 들여 문자열 복제를 수행합니다. 식을 뒤집 으면을 얻습니다 . 이제 우리는 클래스 의 메소드에 대해 이야기하고 있으며 , 그 메소드는 문자열을 인수로 취하는 것을 거부합니다. 확실히 (예를 들어, 인수를 FixNum으로 변환하기 위해 자동으로 최선의 노력을 기울일 수는 있지만) 언어 디자이너는 Ruby의 Perlish 영감을 너무 완전히 수용하지 않기로 결정했습니다. "0".*(999999)*String999999.*("0")*FixNum
FMc

11

비교적 빠른 또 다른 옵션은

str = '%0999999d' % 0

벤치마킹

require 'benchmark'
Benchmark.bm(9)  do |x|
  x.report('format  :') { '%099999999d' % 0 }
  x.report('multiply:') { '0' * 99999999 }
end

곱셈이 여전히 더 빠름을 보여줍니다

               user     system      total        real
format  :  0.300000   0.080000   0.380000 (  0.405345)
multiply:  0.080000   0.080000   0.160000 (  0.172504)

이 답변이 마음에 들지만 '0'이외의 다른 기능으로는 작동하지 않는 것 같습니다. 100 r을 원하면 어떻게해야합니까?
yourdeveloperfriend 친구

2
형식 문자열에서 숫자 패딩을 이용하기 때문에 다른 기호에서는 작동하지 않습니다. 값을 변경하지 않고 숫자를 앞이나 뒤로 0으로 채울 수 있습니다 (소수점) .r은 그렇게 작동하지 않습니다.
Andrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.