Giusto per segnalare test delle prestazioni sconcertanti dei metodi di entrambi (@@@
, @@ # & /@
):
T = RandomReal[{1,100}, {1000000, 2}];
H[F_Symbol, T_List] :=
[email protected][F @@@ T;]/[email protected][F @@ # & /@ T;]
Table[{ToString[F], H[F, T]}, {F, {Plus, Subtract, Times, Divide, Power, Log}}]
Out[3]= {{"Plus", 4.174757},
{"Subtract", 0.2596154},
{"Times", 3.928230},
{"Divide", 0.2674164},
{"Power", 0.3148629},
{"Log", 0.2986936}}
Questi risultati non sono casuali, ma grosso modo proporzionale per dimensioni molto diverse di dati.
@@@
è circa 3-4 volte più veloce per Subtract
, Divide
, Power
, Log
mentre @@ # & /@
è 4 volte più veloce per Plus
e Times
dando origine ad un'altra domanda, che (come si può credere) poteva essere leggermente
chiarite dalla la seguente valutazione:
[email protected]{Plus, Subtract, Times, Divide, Power, Log}
solo Plus
e Times
avere attributi Flat
e Orderless
, mentre tra gli altri solo Power
(che sembra relativamente il più efficiente lì) ha anche un attributo OneIdentity
.
Modifica
Una spiegazione affidabile per un aumento delle prestazioni osservate (grazie alle osservazioni di Leonid Shifrin) dovrebbe andare lungo un percorso diverso.
Per impostazione predefinita c'è MapCompileLength -> 100
in quanto è possibile verificare la valutazione SystemOptions["CompileOptions"]
. Per ripristinare autocompilation di Map possiamo valutare:
SetSystemOptions["CompileOptions" -> "MapCompileLength" -> Infinity]
Ora possiamo testare la performance relativa dei metodi sia valutando una volta di più la nostra H
- funzione di test di prestazioni su simboli correlati e lista:
Table[{ToString[F], H[F, T]}, {F, {Plus, Subtract, Times, Divide, Power, Log}}]
Out[15]= {{"Plus", 0.2898246},
{"Subtract", 0.2979452},
{"Times", 0.2721893},
{"Divide", 0.3078512},
{"Power", 0.3321622},
{"Log", 0.3258972}}
Con questo risultato possiamo concludere che, in generale, l'approccio di Yoda (@@@
) è il più efficiente, mentre quello fornito da Andrei è migliore in caso di Plus
e Times
a causa della compilazione automatica di Map
che consente una migliore p erformance di (@@ # & /@
).
[Correlato] (http://stackoverflow.com/q/5746717/499167) domanda: ** Applica lista agli argomenti in Mathematica ** – tomd