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
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.
C başvurular sadece sözdizimsel şeker?...
Scala içinde sözdizimsel şeker örnekle...
En iyi javascript sözdizimsel şeker...
Kullanarak birden fazla dosya ile daha...
HLists dizilerini yazma dolambaçlı bir...