用一个5000*5000的矩阵测试了下时间,结果如下
In[1]:= n = 5000;
a = RandomReal[2, {n, n}];
In[3]:= cf1 = Compile[{{a, _Real, 2}},
Map[If[# < 1, 1, #] &, a, {-1}]
];
ans1 = cf1[a]; // AbsoluteTiming
Out[4]= {1.436027, Null}
In[5]:= cf2 = Compile[{{a, _Real, 2}},
(a - 1)*UnitStep[a - 1] + 1
];
ans2 = cf1[a]; // AbsoluteTiming
Out[6]= {1.372975, Null}
In[7]:= cf3 = Compile[{{a, _Real, 1}},
(a - 1)*UnitStep[a - 1] + 1, RuntimeAttributes -> Listable
];
ans3 = cf3[a]; // AbsoluteTiming
Out[8]= {0.335225, Null}
In[9]:= ans1 == ans2 == ans3
Out[9]= True
同样规模的数据在MATLAB中的测试时间
可以看到经过向量化+编译的双重优化后,Mathematica的速度才终于赶上了MATLAB(虽然其实还略快了一点)。因为我电脑上没有C编译器,所以不知道加上CompilationTarget -> "C"之后能不能再快点。