Creo que esto es lo más rápido posible, dentro de las prácticas de programación de Mathematica. La única manera que veo para tratar de hacerlo más rápido dentro de MMA es utilizar Compile
con el objetivo de compilación C, de la siguiente manera:
getMinMax =
Compile[{{lst, _Real, 1}},
Module[{i = 1, min = 0., max = 0.},
For[i = 1, i <= Length[lst], i++,
If[min > lst[[i]], min = lst[[i]]];
If[max < lst[[i]], max = lst[[i]]];];
{min, max}], CompilationTarget -> "C", RuntimeOptions -> "Speed"]
Sin embargo, aunque esto parece ser algo más lento que su código:
In[61]:= tst = RandomReal[{-10^7,10^7},10^6];
In[62]:= Do[getMinMax[tst],{100}]//Timing
Out[62]= {0.547,Null}
In[63]:= Do[{[email protected]#,[email protected]#}&[tst],{100}]//Timing
Out[63]= {0.484,Null}
Probablemente pueda escribir la función completamente en C, y luego compilar y cargar como dll - puede eliminar algunos gastos generales de esta manera, pero dudo que gane más que unos pocos porcentajes - no vale la pena el esfuerzo IMO.
EDITAR
Es interesante que usted puede aumentar significativamente la velocidad de la solución compilado con la eliminación de subexpresiones comunes manual (lst[[i]]
aquí):
getMinMax =
Compile[{{lst, _Real, 1}},
Module[{i = 1, min = 0., max = 0., temp},
While[i <= Length[lst],
temp = lst[[i++]];
If[min > temp, min = temp];
If[max < temp, max = temp];];
{min, max}], CompilationTarget -> "C", RuntimeOptions -> "Speed"]
es un poco más rápido que {[email protected]#,[email protected]#}
.
@Mr. Me pregunto si le interesa agregar una edición a sus preguntas con un diagrama de los tiempos para cada respuesta en Mma 7. Publique el código y luego lo ejecutaré en Mma 8 para agregar los resultados también. ¿De acuerdo? –
@belisarius Tengo bastante sueño en este momento, pero no entiendo. –
@Mr. No te preocupes, yo también. Tal vez sea una tontería ... –