Jak zoptymalizować poniższy kod za pomocą zagnieżdżonej pętli while? Wielokrotna opcja?
Mam wyzwanie z fragmentem kodu, którego wykonanie zajmuje bardzo dużo czasu i zastanawiam się, jakie są najważniejsze sztuczki, aby zoptymalizować czas wykonania tego kodu. Muszę przyznać, że dane wejściowe data.frame są znaczące (140 000 wierszy), a dane wyjściowe .frame to około 220 000 wierszy.
Przykład danych wejściowych.frame:
head(extremes)
X_BusinessIDDescription min max month
ID105 2007-12-01 2008-06-01 2007-12-01
ID206 2007-12-01 2009-07-01 2007-12-01
ID204 2007-12-01 2008-02-01 2007-12-01
ID785 2008-07-01 2010-08-01 2008-07-01
ID125 2007-11-01 2008-07-01 2007-11-01
ID107 2007-11-01 2011-06-01 2007-11-01
Data.frame, która zostanie rozszerzona o pętlę. Data.frame jest inicjowana, aby uzyskać strukturę na miejscu.
output <- extremes[1,]
output
X_BusinessIDDescription min max month
ID105 2007-12-01 2008-06-01 2007-12-01
Inne wartości
IDcounter <- 1
IDmax <- nrow(extremes)
linecounter <- 1
Chciałbym zoptymalizować pętlę while:
while (IDcounter <= IDmax){
start <- extremes$min[IDcounter]
end <- extremes$max[IDcounter] # add three months
while(start <= end){
output[linecounter,] <- extremes[IDcounter,]
output$month[linecounter] <- start
linecounter <- linecounter+1
start <- seq(start, by ="month", length=2)[2]
}
IDcounter <- IDcounter + 1
}
Dla niewielkiej liczby wierszy ten kod wykonuje się dość szybko, ale wygląda na to, że zwalnia w miarę rozszerzania się wyjścia.
Dane wyjściowe wyglądają mniej więcej tak:
head(output)
X_BusinessIDDescription min max month
ID105 2007-12-01 2008-06-01 2007-12-01
ID105 2007-12-01 2008-06-01 2008-01-01
ID105 2007-12-01 2008-06-01 2008-02-01
ID105 2007-12-01 2008-06-01 2008-03-01
ID105 2007-12-01 2008-06-01 2008-04-01
ID105 2007-12-01 2008-06-01 2008-05-01
Dla każdego miesiąca w przedziale między min i max w pliku skrajnym tworzony jest wiersz.
Chciałbym również dowiedzieć się, jak mogę, aby ten kod mógł przygotować wiele dostępnych rdzeni zasobów obliczeniowych. OK, przyznaję, że tak naprawdę nie jest to optymalizacja, ale skróci czas wykonania, co również jest ważne.
Jochem