|
|
Re: Replace, ReplaceAll and If time performace comparition
Posted:
Jun 27, 2012 4:06 AM
|
|
Hello,
I played around to see if it is possible to top the performance goal of Clip:
WARNING: SET THE LENGTH OF THE LIST randomList TO A SMALLER VALUE, IF YOU ARE NOT SURE ABOUT HOW MUCH MEMORY YOU CAN ADDRESS AND WANT TO AVOID CRASHING YOUR PC.
(on my computer it was 10*^9 for function cf2)
cf0 = Compile[{{list, _Integer, 1}}, Module[{clist = list, cur}, Do[ clist[[i]] = If[(cur = list[[i]]) > 0, cur, 0], {i, 1, Length[list]}]; clist ], CompilationTarget -> "C" ];
cf1 = Compile[{{list, _Integer, 1}}, Module[{clist = list, cur}, Do[ clist[[i]] = If[(cur = list[[i]]) > 0, cur, 0], {i, 1, Length[list]}]; clist ], CompilationTarget -> "C", RuntimeOptions -> "Quality" ];
cf2 = Compile[{{list, _Integer, 1}}, Module[{clist = list, cur}, Do[ clist[[i]] = If[(cur = list[[i]]) > 0, cur, 0], {i, 1, Length[list]}]; clist ], CompilationTarget -> "C", RuntimeOptions -> "Speed" ];
randomList = RandomInteger[{-100, 100}, 10 10^7];
a = cf2[randomList]; // AbsoluteTiming
{0.756555, Null}
b = Clip[randomList, {0, Infinity}, {0, 1}]; // AbsoluteTiming
{0.713735, Null}
c = cf1[randomList]; // AbsoluteTiming
{0.501313, Null}
d = cf0[randomList]; // AbsoluteTiming
{0.491033, Null}
a == b == c == d
True
As you can see Clip can still be topped by a factor 1.45 by using procedural and compiled code (for me the most interesting enhancements in Mathematica 8).
What I found surprising is that cf2 ("Speed") is slower than cf1 ("Quality") and cf0. I also did not increase the performance when parallelizing (use Parallelization->True). By the way, the ranking between cf1, cf0 is just an incidence . They are of the same performance (on my PC).
Can anyone top the result?
Best,
Christoph
On 06/25/2012 10:01 AM, Andrzej Kozlowski wrote: > On 24 Jun 2012, at 10:26, Murta wrote: > >> HI all >> I was working in some simulations with random numbers and get this example of performance comparition. >> >> randomList = RandomInteger[{-100, 100}, 10 10^6]; >> >> (randomList /. (x_ /; x< 0 -> 0)); // AbsoluteTiming >> {5.747133, Null} >> >> Replace[randomList, (x_ /; x< 0 -> 0), 1]; // AbsoluteTiming >> {4.758984, Null} >> >> (If[#< 0, 0, #]& /@ randomList); // AbsoluteTiming >> {0.572200, Null} >> >> I personally prefer work with patterns because they are more compact and functional. >> Someone knows why patter is one magnitude order slow?? There is some trick to make it faster? >> >> tks >> Murta >> > Purpose built-in functions will always be much faster than general methods (such as pattern matching). However, in this particular your fastest method is actually far from optional: > > In[1]:= randomList=RandomInteger[{-100,100},10 10^6]; > In[2]:= (a=If[#<0,0,#]&/@randomList);//AbsoluteTiming > Out[2]= {0.874206,Null} > In[3]:= (b=Clip[randomList,{0,Infinity},{0,1}]);//AbsoluteTiming > Out[3]= {0.064867,Null} > In[4]:= a==b > Out[4]= True > > There is no way to speed up pattern matching to give comparable performance. > > Andrzej Kozlowski > >
|
|