SORU
16 ŞUBAT 2010, Salı


R'ailenin sözdizimsel şeker daha geçerlidir.

...ile ilgili yürütme zamanı ve / veya bellek.

Eğer bu doğruysa, kod parçacığı ile bunu kanıtlamak. Vektörleştirme ile hızlanma sayılmaz unutmayın. Bu hızlanmaapply (tapply, sapply, ...) kendisinden gelmelidir.

CEVAP
16 ŞUBAT 2010, Salı


R apply fonksiyonları başka bir döngü fonksiyonları (*8 örneğin*) üzerinde geliştirilmiş performans sağlamaz. Bunun tek istisnası, Ar-C kodu daha çok çalışıyor, çünkü biraz daha hızlı olabilir lapply (this question for an example of this bkz.

Ama genel olarak, kural bubir performans için açıklık getirmek için, değil işlevi uygulamak kullanmalısınız.

Bu işte benim de katkım olsungeçerli işlevleri no side effectsBu assign kullanarak geçersiz kılınabilir veya hangi ama <<-, çok tehlikeli olabilir. Yan etkileri de bir program bir değişken durumunu tarihine bağlı olduğundan anlamak zor.

Düzenleme:

Sadece vurgulamak için bu önemsiz bir örnek yinelemeli olarak hesaplayan Fibonacci dizisi; bu olabilir çalıştırmak için birden çok kez olsun doğru bir ölçü, ama gerçek şu ki hiçbir yöntem önemli ölçüde farklı performans

> fibo <- function(n) {
    if ( n < 2 ) n
    else fibo(n-1)   fibo(n-2)
  }
> system.time(for(i in 0:26) fibo(i))
   user  system elapsed 
   7.48    0.00    7.52 
> system.time(sapply(0:26, fibo))
   user  system elapsed 
   7.50    0.00    7.54 
> system.time(lapply(0:26, fibo))
   user  system elapsed 
   7.48    0.04    7.54 
> library(plyr)
> system.time(ldply(0:26, fibo))
   user  system elapsed 
   7.52    0.00    7.58 

Edit 2:

İlgili kullanım paralel paketleri için R (örneğin rpvm, rmpi, kar), bu genellikle sağlamak apply aile işlevleri (bile foreach paket aslında eşdeğer rağmen adı). İşte snow: sapply işlevi basit bir örnek

library(snow)
cl <- makeSOCKcluster(c("localhost","localhost"))
parSapply(cl, 1:20, get(" "), 3)

Bu örnek için herhangi bir ek yazılım yüklü olması gerekir soket bir küme, kullanır; aksi halde PVM (MPI) (Tierney's clustering page) gibi bir şey gerekir. snow uygulamak aşağıdaki işlevlere sahiptir:

parLapply(cl, x, fun, ...)
parSapply(cl, X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
parApply(cl, X, MARGIN, FUN, ...)
parRapply(cl, x, fun, ...)
parCapply(cl, x, fun, ...)

apply fonksiyonlarını beri paralel yürütme için kullanılması gereken mantıklıyokside effects. for bir döngü içinde değişken bir değeri değiştirdiğinizde, küresel olarak ayarlanır. Öte yandan, tüm apply işlevleri güvenle kullanılabilecek paralel çünkü değişiklikler yerel işlev çağrısı (sürece kullanmaya assign <<- bu durumda, sen-ebilmek tanıtmak yan etkiler). Söylemeye gerek yok, kritik paralel yürütme ile uğraşırken, yerel / global değişkenler konusunda dikkatli, özellikle.

Düzenleme:

İşte yan etkileri ile ilgili olarak for *apply arasındaki farkı şimdiye kadar göstermek için basit bir örnek:

> df <- 1:10
> # *apply example
> lapply(2:3, function(i) df <- df * i)
> df
 [1]  1  2  3  4  5  6  7  8  9 10
> # for loop example
> for(i in 2:3) df <- df * i
> df
 [1]  6 12 18 24 30 36 42 48 54 60

Üst ortamında df for tarafından değiştirilmiş ama *apply nasıl not.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006
  • gsipek

    gsipek

    20 Temmuz 2007
  • Noam Erez

    Noam Erez

    3 NİSAN 2012