Nasıl verimli Ar-Rprof kullanılır?
Eğer R
-Kod bir profil elde etmenin mümkün olup olmadığını bilmek matlab
's Profiler. benzer bir şekilde istiyorum Yani, kişinin hangi tanımak için özellikle yavaş.
Ben şimdiye kadar acchieved ne şekilde tatmin edici değil. Rprof
bana bir profil dosyası yapmak için kullanılır. summaryRprof
aşağıdaki gibi bir şey kullanarak
$by.self self.time self.pct total.time total.pct [.data.frame 0.72 10.1 1.84 25.8 inherits 0.50 7.0 1.10 15.4 data.frame 0.48 6.7 4.86 68.3 unique.default 0.44 6.2 0.48 6.7 deparse 0.36 5.1 1.18 16.6 rbind 0.30 4.2 2.22 31.2 match 0.28 3.9 1.38 19.4 [<-.factor 0.28 3.9 0.56 7.9 levels 0.26 3.7 0.34 4.8 NextMethod 0.22 3.1 0.82 11.5 ...
ve
$by.total total.time total.pct self.time self.pct data.frame 4.86 68.3 0.48 6.7 rbind 2.22 31.2 0.30 4.2 do.call 2.22 31.2 0.00 0.0 [ 1.98 27.8 0.16 2.2 [.data.frame 1.84 25.8 0.72 10.1 match 1.38 19.4 0.28 3.9 %in% 1.26 17.7 0.14 2.0 is.factor 1.20 16.9 0.10 1.4 deparse 1.18 16.6 0.36 5.1 ...
Dürüst olmak gerekirse, bu çıkışı ile benim sorunları (a) data.frame
çok sık kullanıyorum çünkü nerede anlamıyorum ve (b) ben asla, *15 örneğin* kullanın. Ayrıca, [
nedir?
profr
ama daha fazla yararlı olmadı Hadley Wickham aşağıdaki grafiği dikkate denedim:
Daha rahat bir şekilde numaraları ve özel işlev çağrıları yavaş olan var mı?
Ya, bakın, ben orada bazı edebiyat?
Herhangi bir ipucu takdir.
EDİT 1:
Hadley'in yorum dayalı senaryomu aşağıda ve arsa Bankası, graph sürüm kodu yapıştırın. Ama unutmayın, benim sorum bu belirli bir komut ile ilgili değildir. Geçenlerde yazdığım sadece rastgele bir script.Darboğazları bulmak ve R
-kodu hızlandırmak için nasıl genel bir yol arıyorum.
Verileri (x
) bu gibi görünüyor:
type word response N Classification classN Abstract ANGER bitter 1 3a 3a Abstract ANGER control 1 1a 1a Abstract ANGER father 1 3a 3a Abstract ANGER flushed 1 3a 3a Abstract ANGER fury 1 1c 1c Abstract ANGER hat 1 3a 3a Abstract ANGER help 1 3a 3a Abstract ANGER mad 13 3a 3a Abstract ANGER management 2 1a 1a ... until row 1700
Senaryo (kısa anlatım):
Rprof("profile1.out") # A new dataset is produced with each line of x contained x$N times y <- vector('list',length(x[,1])) for (i in 1:length(x[,1])) { y[[i]] <- data.frame(rep(x[i,1],x[i,"N"]),rep(x[i,2],x[i,"N"]),rep(x[i,3],x[i,"N"]),rep(x[i,4],x[i,"N"]),rep(x[i,5],x[i,"N"]),rep(x[i,6],x[i,"N"])) } all <- do.call('rbind',y) colnames(all) <- colnames(x) # create a dataframe out of a word x class table table_all <- table(all$word,all$classN) dataf.all <- as.data.frame(table_all[,1:length(table_all[1,])]) dataf.all$words <- as.factor(rownames(dataf.all)) dataf.all$type <- "no" # get type of the word. words <- levels(dataf.all$words) for (i in 1:length(words)) { dataf.all$type[i] <- as.character(all[pmatch(words[i],all$word),"type"]) } dataf.all$type <- as.factor(dataf.all$type) dataf.all$typeN <- as.numeric(dataf.all$type) # aggregate response categories dataf.all$c1 <- apply(dataf.all[,c("1a","1b","1c","1d","1e","1f")],1,sum) dataf.all$c2 <- apply(dataf.all[,c("2a","2b","2c")],1,sum) dataf.all$c3 <- apply(dataf.all[,c("3a","3b")],1,sum) Rprof(NULL) library(profr) ggplot.profr(parse_rprof("profile1.out"))
Son veri bu gibi görünüyor:
1a 1b 1c 1d 1e 1f 2a 2b 2c 3a 3b pa words type typeN c1 c2 c3 pa 3 0 8 0 0 0 0 0 0 24 0 0 ANGER Abstract 1 11 0 24 0 6 0 4 0 1 0 0 11 0 13 0 0 ANXIETY Abstract 1 11 11 13 0 2 11 1 0 0 0 0 4 0 17 0 0 ATTITUDE Abstract 1 14 4 17 0 9 18 0 0 0 0 0 0 0 0 8 0 BARREL Concrete 2 27 0 8 0 0 1 18 0 0 0 0 4 0 12 0 0 BELIEF Abstract 1 19 4 12 0
Temel grafik çizim:
CEVAP
Dün " uyarı okuyucular breaking news (R 3.0.0
nihayet dışarı) bu soruya doğrudan ilgili ilginç bir şey fark etmiş olabilir:
- Rprof) profil şimdi isteğe bağlı olarak ifade düzeyi, sadece işlev düzeyinde bilgi kayıtları.
Ve gerçekten de, bu yeni özellik sorumu yanıtlar ve nasıl yapılacağını göstereceğim.
Hadi, vectorizing ve ön ayrılırken eski güzel daha iyi için-döngüler ve ortalama gibi özet bir istatistik hesaplamak için veri artımlı bina gerçekten olup olmadığını karşılaştırmak için. Nispeten aptal, kod şudur:
# create big data frame:
n <- 1000
x <- data.frame(group = sample(letters[1:4], n, replace=TRUE), condition = sample(LETTERS[1:10], n, replace = TRUE), data = rnorm(n))
# reasonable operations:
marginal.means.1 <- aggregate(data ~ group condition, data = x, FUN=mean)
# unreasonable operations:
marginal.means.2 <- marginal.means.1[NULL,]
row.counter <- 1
for (condition in levels(x$condition)) {
for (group in levels(x$group)) {
tmp.value <- 0
tmp.length <- 0
for (c in 1:nrow(x)) {
if ((x[c,"group"] == group) & (x[c,"condition"] == condition)) {
tmp.value <- tmp.value x[c,"data"]
tmp.length <- tmp.length 1
}
}
marginal.means.2[row.counter,"group"] <- group
marginal.means.2[row.counter,"condition"] <- condition
marginal.means.2[row.counter,"data"] <- tmp.value / tmp.length
row.counter <- row.counter 1
}
}
# does it produce the same results?
all.equal(marginal.means.1, marginal.means.2)
Rprof
, biz bu kodu kullanmak için 26 ** gerekiyor. Yani, bir dosya olması lazım ve oradan aradı. Dolayısıyla, pastebin bunu yükledim ama yerel dosyaları ile tam olarak aynı şekilde çalışır.
Şimdi, biz
- sadece profil dosyası oluşturmak ve satır numarasını kaydetmek istiyoruz gösteriyor
- kaynak inanılmaz kombinasyonu
eval(parse(..., keep.source = TRUE))
code (görünüşte rezilfortune(106)
başka bir yol bulamadım gibi, burada geçerli değildir) - profil oluşturma durdurmak ve çıkış satır numarası üzerine istediğimiz göstermektedir.
Kod:
Rprof("profile1.out", line.profiling=TRUE)
eval(parse(file = "http://pastebin.com/download.php?i=KjdkSVZq", keep.source=TRUE))
Rprof(NULL)
summaryRprof("profile1.out", lines = "show")
Hangi verir:
$by.self
self.time self.pct total.time total.pct
download.php?i=KjdkSVZq#17 8.04 64.11 8.04 64.11
<no location> 4.38 34.93 4.38 34.93
download.php?i=KjdkSVZq#16 0.06 0.48 0.06 0.48
download.php?i=KjdkSVZq#18 0.02 0.16 0.02 0.16
download.php?i=KjdkSVZq#23 0.02 0.16 0.02 0.16
download.php?i=KjdkSVZq#6 0.02 0.16 0.02 0.16
$by.total
total.time total.pct self.time self.pct
download.php?i=KjdkSVZq#17 8.04 64.11 8.04 64.11
<no location> 4.38 34.93 4.38 34.93
download.php?i=KjdkSVZq#16 0.06 0.48 0.06 0.48
download.php?i=KjdkSVZq#18 0.02 0.16 0.02 0.16
download.php?i=KjdkSVZq#23 0.02 0.16 0.02 0.16
download.php?i=KjdkSVZq#6 0.02 0.16 0.02 0.16
$by.line
self.time self.pct total.time total.pct
<no location> 4.38 34.93 4.38 34.93
download.php?i=KjdkSVZq#6 0.02 0.16 0.02 0.16
download.php?i=KjdkSVZq#16 0.06 0.48 0.06 0.48
download.php?i=KjdkSVZq#17 8.04 64.11 8.04 64.11
download.php?i=KjdkSVZq#18 0.02 0.16 0.02 0.16
download.php?i=KjdkSVZq#23 0.02 0.16 0.02 0.16
$sample.interval
[1] 0.02
$sampling.time
[1] 12.54
source code kontrol sorunlu satır (#17) gerçekten aptal döngü için if
-deyim olduğunu söyler. Aynı vectorized kodu (hat #6) kullanarak hesaplamak için temel olarak zaman ile karşılaştırıldığında.
Herhangi bir grafik çıkışı ile hiç denemedim, ama zaten şimdiye kadar ne aldım çok etkilendim.
Nasıl verimli bir şekilde anahtarları/...
Vim kayıtları nasıl kullanılır?...
Nasıl yansıması genel bir Yöntemi çağı...
Geçişlerini için Dinlenmek nedir ve na...
Nasıl ve kabuk boolean değişkenleri bi...