R ile Yüksek Performanslı Programlama — 4
4. yazımızda veri yapılarının kod performansına olan etkisini göreceğiz.
Daha Basit Veri Yapılari Kullanmak
data.frame R’da en sık kullanılan değişken tiplerindendir. Çok da kullanışlıdır, farklı değişken tiplerini barındırabilir. Fakat data.frame ile çalışmak büyük verilerde performans düşüklüğüne yol açabilir. Bu bölümde 2 farklı alternatiften bahsedeceğim. Birisi matrix kullanımı, diğeri de data.table kullanımı olacak.
Matrix vs Dataframe
Aslında bu karşılaştırma doğru bir karşılaştırma değil. Çünkü bu iki veri tipi tamamen aynı veri tipleri değil. Matrix sadece sayısal değişkenleri barındırırken data frame birden fazla değişken tipini barındırabilir. Bu nedenle biz bu karşılaştırmayı sadece sayısal değerler içeren bir data frame ile matrix arasında yapacağız. Elimizde sadece sayısal değerler varsa ve performans sıkıntısı yaşıyorsak verimizin matrix olup olmadığını kontrol etmemiz gerektiğini, değilse de matrix’e çevirmemiz gerektiğini şimdi bir örnek ile görelim.
data <- rnorm(1E4*1000)
dim(data) <- c(1E4, 1000)
class(data)
[1] "matrix"
system.time(data_rs1 <- rowSums(data))
user system elapsed
0.030 0.003 0.037
data_df <- data.frame(data)
system.time(data_rs2 <- rowSums(data_df))
user system elapsed
0.060 0.005 0.068
‘data’ isimli değişken matrix tipinde bir değişken. rowSums(data) fonksiyonu satırlardaki değerleri topluyor, bunu da data matrixini kullanarak yapıyor. Bu işlem 0.037 saniye sürerken data.frame versiyonu 0.068 saniye sürüyor. Önceki yazımızda vektör boyutunun performans üzerindeki etkisini görmüştük, dilerseniz bu seferde vektörün boyutunu arttırınca performans farkı nasıl etkileniyor siz görün :)
Şimdi data.table hakkında konuşalım.
data.table nedir?
data.table bir R paketidir. Bu paket bize data frame’in gelişmiş versiyonu olan data.table veri tipini verir. data.frame ile yapabileceğimiz her şeyi data.table ile de yapabiliriz. Ve bu işlemlerin hepsi çok daha hızlı gerçekleşir. Veriyi almak, yazdırmak, işlemek data.table veri tipi ve ona özel fonksiyonlarla çok daha hızlı gerçekleşir. Ayrıca veri manipülasyonlarında da oldukça hızlıdır. Derslerimizde sıklıkla kullandığımız ‘dplyr’ paketinden daha yüksek bir performansa sahiptir. Yaklaşık 450 bin satırlık bir veriyi hem read.csv hem de bu fonksiyonun data.table versiyonu olan fread’le alıp performanslarını karşılaştıralım.
system.time(dt <- read.csv(“data.csv”))
user system elapsed
11.46 0.21 11.69system.time(dt <- fread(“data.csv”))
user system elapsed
0.66 0.00 0.66dim(dt)
[1] 439541 18
Gördüğünüz gibi fark çok büyük. data.table paketi bu denli bir peformans artışı sağlar.
Şimdi de data.frame ve dplyr paketi ile yaptığımız bir analizi bir de data.table ile yapalım. Kullanılan veri 11 milyon satıra ve 7 sütuna sahip. Bu iki kod bize tamamen aynı sonucu veriyor. Fakat performansları arasında ciddi bir fark var.
system.time(brand <- data %>% group_by(ID, CAT, BRAND) %>% summarise(count = n(),OrtFiyat = mean(PRICE), maxFiyat = max(PRICE), range =((max(PRICE) — min(PRICE)) / min(PRICE))))user system elapsed
671.11 0.39 671.80system.time(brand <- data[, .(count = .N, OrtFiyat = mean(PRICE), maxFiyat = max(PRICE), range =((max(PRICE) — min(PRICE)) / min(PRICE)) ), by = list(ID, CAT, BRAND), ])user system elapsed
37.95 0.03 37.98
Aradaki performans farkının kaç kat olduğu ortada. dplyr bize büyük bir esneklik sağlar, syntax’i data.table’a göre daha kolaydır fakat bir kez alıştıktan sonra data.table çok daha kullanışlı gelecektir. Özellikle bu örnekte olduğu gibi büyük verilerde.
Daha fazlası için data.table dökümantasyonuna göz atabilirsiniz.
R ile ilgili daha fazla içerik ve video dersler için R Programlama ile Veri Bilimi isimli Udemy kursumu inceleyebilirsiniz.