2010-02-19 12 views
102

Jaki jest najlepszy sposób, aby szybko wygenerować długą strunę w ruby? To działa, ale jest bardzo powolny:W języku Ruby, jak wygenerować długi ciąg powtarzanego tekstu?

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

Zauważyłem również, że tworzenie ciąg przyzwoitej długości, a następnie dodanie do istniejącego że ciąg do żądanej długości działa znacznie szybciej:

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

Jakieś inne sugestie?

+1

The B najlepszym sposobem byłoby użycie JRuby i użycie StringBuffer. Oooooh. –

Odpowiedz

230
str = "0" * 999999 
+37

lolwut? Ruby jest dziwna. +1 – you786

+2

Klasyczny ruby ​​haha ​​ – amrcus

+8

Rzeczywiście, bardzo dziwne, spójrz jak inny i elegancki wygląda w Pythonie: 'str =" 0 "* 999999';) – tokland

10

Inną opcją jest stosunkowo szybkie

str = '%0999999d' % 0 

Choć benchmarking

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

Pokazuje, że mnożenie jest jeszcze szybsze

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

Podoba mi się ta odpowiedź, ale wydaje mi się, że nie działa ona dla niczego innego niż "0". Co mam zrobić, jeśli chcę 100 r's? – yourdeveloperfriend

+2

Nie będzie działać z innymi symbolami, ponieważ wykorzystuje zalety numerowania w ciągach formatów. Liczby mogą być wypełnione zerami z przodu lub z tyłu (w przypadku liczb dziesiętnych) bez zmiany wartości, r nie działają w ten sposób. –

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

To po prostu drukuje dane wyjściowe. Pytanie dotyczyło wygenerowania samego napisu. – onnimonni