2010-02-19 8 views
102

Quelle est la meilleure façon de générer une longue chaîne rapidement en ruby? Cela fonctionne, mais il est très lent:Dans Ruby, comment générer une longue chaîne de texte répété?

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

J'ai aussi remarqué que la création d'une chaîne d'une longueur décente, puis à une annexant que chaîne existante jusqu'à la longueur désirée fonctionne beaucoup plus rapidement:

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

D'autres suggestions?

+1

Le b Le plus serait d'utiliser JRuby et d'utiliser StringBuffer. Oooooh. –

Répondre

230
str = "0" * 999999 
+37

lolwut? Ruby est bizarre. +1 – you786

+2

Classique ruby ​​haha ​​ – amrcus

+8

En effet, très bizarre, regardez comment différents et élégants ressemble en Python: 'str =" 0 "* 999999';) – tokland

10

Une autre option relativement rapide est

str = '%0999999d' % 0 

Bien que l'analyse comparative

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

Indique que la multiplication est encore plus rapide

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

J'aime cette réponse, mais je n'arrive pas à l'obtenir pour autre chose que '0'. Qu'est-ce que je fais si je veux 100 r? – yourdeveloperfriend

+2

Il ne fonctionnera pas avec d'autres symboles, car il profite du remplissage de nombre dans les chaînes de format. Les nombres peuvent être complétés avec des 0 à l'avant ou à l'arrière (pour les décimales) sans changer la valeur, les r ne fonctionnent pas comme ça. –

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

Cela imprime simplement la sortie. La question portait sur la génération de la chaîne elle-même. – onnimonni

Questions connexes