Search All of the Math Forum:

Views expressed in these public forums are not endorsed by NCTM or The Math Forum.

Notice: We are no longer accepting new posts, but the forums will continue to be readable.

Topic: Replace, ReplaceAll and If time performace comparition
Replies: 13   Last Post: Jul 14, 2012 1:31 AM

 Messages: [ Previous | Next ]
 Christoph Lhotka Posts: 39 Registered: 2/9/12
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
>
>

Date Subject Author
6/25/12 Andrzej Kozlowski
6/25/12 Bob Hanlon
6/27/12 Christoph Lhotka
6/28/12 Albert Retey
6/28/12 Albert Retey
6/29/12 Christoph Lhotka
6/30/12 Albert Retey
7/14/12 Dana DeLouis
7/11/12 Murta
7/11/12 Murta
7/11/12 George Woodrow III