MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

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
>
>




  • Prev by Date: Creating a PDF graphic with Mathematica
  • Next by Date: Re: needed.
  • Previous by thread: Re: Replace, ReplaceAll and If time performace comparition
  • Next by thread: Re: Replace, ReplaceAll and If time performace comparition