Я думаю, что это так же быстро, как и в практике программирования Mathematica. Единственный способ ускорить его в mma - использовать Compile
с целью компиляции C, как показано ниже:
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"]
Однако даже это, кажется, немного медленнее, чем ваш код:
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[{Min@#,Max@#}&[tst],{100}]//Timing
Out[63]= {0.484,Null}
Вы, вероятно, можете написать функцию целиком на C, а затем скомпилировать и загрузить ее как dll - вы можете устранить некоторые накладные расходы таким образом, но я сомневаюсь, что вы выиграете больше, чем несколько процентов - не стоит усилий IMO.
EDIT
Интересно, что вы можете значительно увеличить скорость скомпилированного решения с помощью ручного исключения общих подвыражений (lst[[i]]
здесь):
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"]
немного быстрее, чем {Min@#,Max@#}
.