Как лучше всего быстро сгенерировать длинную строку в рубине? Это работает, но очень медленно:
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}
Есть другие предложения?
Ответы:
str = "0" * 999999
источник
str = "0" * 999999
99999 * "0"
я получуTypeError: String can't be coerced into Fixnum
"0" * 999999
рассматривается как"0".*(999999)
где*
находится метод вString
классе. Этот метод принимает числа как допустимые аргументы для выполнения репликации строки. Если перевернуть выражение, мы получим999999.*("0")
. Теперь мы говорим о*
методе вFixNum
классе, и этот метод отказывается принимать строки в качестве аргументов. Конечно, может (например, автоматически прилагая все усилия для преобразования аргумента в FixNum), но разработчики языка решили не использовать идеи Ruby Perlish в полной мере.Другой относительно быстрый вариант -
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)
источник