Projekt R

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:)