Jaki jest najlepszy sposób na szybkie wygenerowanie długiego ciągu w rubinie? To działa, ale działa bardzo wolno:
str = ""
length = 100000
(1..length).each {|i| str += "0"}
Zauważyłem również, że tworzenie łańcucha o przyzwoitej długości, a następnie dołączanie go do istniejącego ciągu 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?
Odpowiedzi:
źródło
str = "0" * 999999
99999 * "0"
dostanęTypeError: String can't be coerced into Fixnum
"0" * 999999
jest traktowany jako metoda"0".*(999999)
gdzie*
jest metodą wString
klasie. Ta metoda akceptuje liczby jako prawidłowe argumenty do wykonywania replikacji ciągów. Kiedy odwrócisz wyrażenie, otrzymamy999999.*("0")
. Teraz mówimy o*
metodzie wFixNum
klasie, a ta metoda odmawia przyjęcia łańcuchów jako argumentów. Z pewnością mogłoby to (na przykład automatycznie dokładać wszelkich starań, aby przekształcić argument w FixNum), ale projektanci języka zdecydowali się nie wykorzystywać w pełni inspiracji Ruby Perlish.Inną stosunkowo szybką opcją jest
Chociaż testy porównawcze
Pokazuje, że mnożenie jest nadal szybsze
źródło