SORU
6 EYLÜL 2010, PAZARTESİ


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: alt text

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: alt text

Running the script today also changed the ggplot2 graph a little (basically only the labels), see here.

CEVAP
4 NİSAN 2013, PERŞEMBE


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 rezil fortune(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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dellbear816

    Dellbear816

    4 Mart 2008
  • Howard Pinsky

    Howard Pinsk

    6 AĞUSTOS 2006
  • Rooster Teeth

    Rooster Teet

    11 Temmuz 2006