Re: Replace, ReplaceAll and If time performace comparition
- To: mathgroup at smc.vnet.net
- Subject: [mg127042] Re: Replace, ReplaceAll and If time performace comparition
- From: Christoph Lhotka <christoph.lhotka at fundp.ac.be>
- Date: Wed, 27 Jun 2012 04:05:37 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201206240826.EAA08423@smc.vnet.net> <201206250801.EAA15438@smc.vnet.net>
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 > >
- References:
- Replace, ReplaceAll and If time performace comparition
- From: Murta <rodrigomurtax@gmail.com>
- Re: Replace, ReplaceAll and If time performace comparition
- From: Andrzej Kozlowski <akozlowski@gmail.com>
- Replace, ReplaceAll and If time performace comparition