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