Acaba de informar las pruebas de rendimiento desconcertantes de los métodos de ambos (@@@
, @@ # & /@
):
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}}
Estos resultados no son aleatorios, pero más o menos proporcional de muy diferentes tamaños de datos.
@@@
es aproximadamente 3-4 veces más rápido para Subtract
, Divide
, Power
, mientras Log
@@ # & /@
es 4 veces más rápido para Plus
y Times
dando lugar a otras preguntas, que (como se puede creer) podría estar ligeramente
despejada por el la siguiente evaluación:
[email protected]{Plus, Subtract, Times, Divide, Power, Log}
Sólo Plus
y Times
tienen atributos Flat
y Orderless
, mientras que entre el resto solamente Power
(que parece relativamente más eficiente allí) también tiene un atributo OneIdentity
.
Editar
Una explicación fiable de incremento en el rendimiento observados (gracias a las declaraciones de Leonid Shifrin) debe ir a lo largo de una ruta diferente.
Por defecto hay MapCompileLength -> 100
como podemos comprobar evaluando SystemOptions["CompileOptions"]
. Para restablecer autocompilation de Mapa podemos evaluar:
SetSystemOptions["CompileOptions" -> "MapCompileLength" -> Infinity]
Ahora podemos probar el rendimiento relativo de los métodos de ambos mediante la evaluación una vez más nuestra H
- función de las pruebas de rendimiento en los símbolos relacionados y la 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}}
Teniendo estos resultados podemos concluir que, en general, el enfoque de Yoda (@@@
) es el más eficiente, mientras que el proporcionado por Andrei es mejor en el caso de Plus
y Times
debido a la compilación automática de Map
que permite una mejor p rendimiento de (@@ # & /@
).
Pregunta [relacionado] (http://stackoverflow.com/q/5746717/499167): ** Aplicar lista a argumentos en Mathematica ** – tomd