Przyspieszanie skryptów – sprawdź ile trwa twój kod
Język R ciągle się rozwija. Użytkownicy tworzą i udostępniają coraz to więcej nowych funkcji. Niektóre z nich robią to samo co powstałe wcześniej, ale w krótszym czasie. Technologia po prostu idzie do przodu:)
W trakcie pisania lub optymalizacji istniejącego kodu najlepiej sprawdzić czy wykorzystane/napisane przez nas rozwiązanie nie jest czasami wolniejsze od innego podejścia do problemu. Możemy to zrobić z użycie dwóch narzędzi zaimplementowanych w bazowym R: Sys.time i system.time. Pokażemy Wam dzisiaj jak wykorzystać je wykorzystać. Na początek sprawdzimy jak szybko wczytują się dane wektorowe przy wykorzystaniu funkcji z pakietu rgdal i sf. Wczytamy warstwę prawie 600 tys. budynków z projektu OSM dla woj. mazowieckiego:
file_path = "d:/gis.osm_buildings_a_free_1.shp"
Sys.time zwraca konkretny czas. Do sprawdzenia szybkości działania funkcji najpierw musimy zapisać do zmiennej np. start_time czas początkowy, a następnie po wykonaniu funkcji/części kodu odjąć czas zakończenia od czasu startowego. W naszym przypadku będzie wyglądało to tak:
start_time <- Sys.time() shp <- readOGR(file_path) readOGR_time <- Sys.time() - start_time start_time <- Sys.time() shp <- read_sf(file_path) read_sf_time <- Sys.time() - start_time
Sprawdźmy ile poszczególne funkcje wczytują dane:
> readOGR_time Time difference of 2.185839 mins > read_sf_time Time difference of 16.71565 secs
Sf jest ponad 8x szybszy:)
A jak zastosować system.time. Ta funkcja zwraca czas działanie całej funkcji. Możemy także stworzyć naszą funkcję, zawierającą część skryptu i sprawdzić ile ona zajmuje. Tym razem wczytamy użytkowanie terenu z OSM:
file_path <- "d:/gis.osm_landuse_a_free_1.shp"
I napiszemy dwie funcje:
func1 <- function(path) { readOGR(path) } func2 <- function(path) { read_sf(path) }
I wpiszemy je do system.time:
system.time(func1(file_path)) system.time(func2(file_path))
Wynik system.time wygląda następująco:
> system.time(func1(file_path)) OGR data source with driver: ESRI Shapefile Source: "d:\My_Documents\Geoprofesja\mazowieckie-latest-free.shp\gis.osm_landuse_a_free_1.shp", layer: "gis.osm_landuse_a_free_1" with 113239 features It has 4 fields uzytkownik system uplynelo 24.04 2.60 26.66 > system.time(func2(file_path)) uzytkownik system uplynelo 2.04 0.44 2.48
Tym razem sf poradził sobie 10x szybciej.
Pokazaliśmy Wam dzisiaj jak w łatwy sposób wykorzystać podstawowe funkcje do pomiaru czasu działania poszczególnych części kodu. Jak widzicie dwie funkcje robią to samo (wczytują shp do R) w znacząco różnym czasie. Zalecamy zatem, aby przetestować kilka rozwiązań, a czasami napisać swoją funkcję, która może działać szybciej od już opracowanych.
Świat musi iść do przodu:) Miłego optymalizowania:)