2010-02-19 10 views
102

¿Cuál es la mejor forma de generar una cadena larga rápidamente en rubí? Esto funciona, pero es muy lento:En Ruby, ¿cómo puedo generar una cadena larga de texto repetido?

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

También he notado que la creación de una cadena de una longitud decente y a continuación, añadiendo que a una cadena existente hasta la longitud deseada funciona mucho más rápido:

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

¿Alguna otra sugerencia?

+1

El b Esto sería usar JRuby y usar StringBuffer. Oooooh. –

Respuesta

230
str = "0" * 999999 
+37

lolwut? Ruby es raro. +1 – you786

+2

Ruby clásico jaja – amrcus

+8

De hecho, muy raro, mira lo diferente y elegante que se ve en Python: 'str =" 0 "* 999999';) – tokland

10

Otra opción es relativamente rápido

str = '%0999999d' % 0 

Aunque la evaluación comparativa

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

Muestra que la multiplicación es todavía más rápido

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

Me gusta esta respuesta, pero parece que no puedo hacer que funcione para nada más que '0'. ¿Qué hago si quiero 100 r's? – yourdeveloperfriend

+2

No funcionará con otros símbolos porque está aprovechando el relleno de números en las cadenas de formato. Los números se pueden rellenar con 0 delante o detrás (para decimales) sin cambiar el valor, los r's no funcionan así. –

-5
999999999999999999.times{ 
print "0" 
} 
+0

Esto solo imprime la salida. La pregunta era sobre generar la cadena en sí. – onnimonni

Cuestiones relacionadas