Модификация подхода Mr.Wizard работает в несколько раз быстрее.
maxListFast[list_List] := Module[{l},
l = Max /@ Transpose@list;
If[MemberQ[list, l], l, {}]]
Мы тестируем оба метода с
test = RandomInteger[100, {500000, 10}];
test1 = Insert[test, Table[100, {10}], RandomInteger[{1, 500000}]];
и мы получаем
In[5]:= maxList[test] // Timing
maxListFast[test] // Timing
Out[5]= {2.761, {}}
Out[6]= {0.265, {}}
и
In[7]:= maxList[test1] // Timing
maxListFast[test1] // Timing
Out[7]= {1.217, {{100, 100, 100, 100, 100, 100, 100, 100, 100, 100}}}
Out[8]= {0.14, {100, 100, 100, 100, 100, 100, 100, 100, 100, 100}}
EDIT
В общем, чтобы выбрать метод, мы должны сначала знать, с какими данными мы имеем дело. (длина списков, их количество, типы номеров). Пока у нас большое количество коротких списков
целых чисел maxListFast
работает даже в 10 раз лучше (в случае 500000 списков длиной 10), чем maxList
.
Однако для списков действительных чисел это только в 3-4 раза быстрее, и чем больше и длиннее список, тем больше он замедляется, например. :
A = RandomReal[1000, {3000, 3000}];
First@AbsoluteTiming[maxListFast@A;]/ First@AbsoluteTiming[maxList@A;]
Out[19]= 2.040516
однако, если мы вставим «величайший элемент»:
In[21]:= IA = Insert[A, Table[1000, {3000}], RandomInteger[{1, 3000}]];
In[22]:= First@AbsoluteTiming[maxListFast@IA;]/ First@AbsoluteTiming[maxList@IA;]
Out[22]= 0.9781931
время близко.