DMUG-Archiv 2011

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Performance mit AppendTo

Hallo zusammen

   und vielen herzlichen Dank für die schnelle und aufschlussreiche Hilfe. Auf "Schiff" und "Wasser" als Ursache wäre 
ich nicht so einfach drauf gekommen. 

Zur Frage warum nicht Table verwendet wird: Dieses Codebeispiel (wie die meisten von mir) ist für Studierende gedacht, 
die noch keine Mathematica Berührung hatten, da schreibe ich den Code immer so, daß er auf Lesbarkeit optimiert ist 
(Do-Schleifen kennen halt die meisten) und hier sollte nur eine Besonderheit (Reap/Sow) herausgepickt werden. 


Viele Grüße

m.g.


Michael Gamer
Zur Römerbrücke 19
63456 Hanau 

Telefon:        06181 663363
Fax:            06181 663363
Mail:   mg@XXXXXXX.de

home:           www.michaelgamer.de
photos:                 www.mg-photo.de
kalender:       www.tungle.me/michaelgamer

Am 30.08.2011 um 12:00 schrieb Udo und Susanne Krause:

> Hallo Michael,
> 
>> probieren Sie mit MemoryInUse[] aus, ob Mma 8.0.1 an den
>> Stichprobenlaengen, bei denen AppendTo[] zeitlich angespannt ist,
>> Speicher freigibt.
> 
> ... kurz vor dem Mittag das noch aufgeräumt:
> 
> In[1]:= Remove[step]
> step[o_Integer (* 1: Schiff, 0: Wasser *)] := o;
> step[l_List] := Which[Last[l] >= 16, 1,
>                   Mod[First[l],8] == 0, 0,
>                   True, l + RandomChoice[{{0,0},{1,0},{-1,0},{0,1}}]];
> 
> In[12]:= Remove[wegeerzeugen]
> wegeerzeugen[n_Integer] := Module[{wege = {}},
>  Do[
>   AppendTo[wege,
>    FixedPointList[step, {4, 1},
>     SameTest -> (#1 == #2 && Head[#1] == Integer &)]],
>   {n}
>   ];
>  wege
>  ]
> 
> In[14]:= First  @ (Timing @ wegeerzeugen[10000])
> Out[14]= 2.683
> 
> Warum wird hier Table[] nicht verwendet?
> Do[], AppendTo[], Reap[], Sow[] sind völlig überrissen an der Stelle.
> 
> In[15]:= Remove[wegeerzeugenReap]
> wegeerzeugenReap[n_Integer] := Module[{temp = {}},
>  Reap[Do[
>     temp =
>      FixedPointList[step, {4, 1},
>       SameTest -> (#1 == #2 && Head[#1] == Integer &)];
>     Sow[temp],
>     {n}
>     ];]
>  ]
> 
> In[17]:= First @ (Timing @ wegeerzeugenReap[10000])
> Out[17]= 2.137
> 
> nun ist AppendTo[] nur noch schwach langsamer als Reap/Sow
> und das Bildchen von
> 
> In[18]:= temp = Table[{First[Timing[wegeerzeugen[i]]],
>    First[Timing[wegeerzeugenReap[i]]]}, {i, 100, 10000, 100}];
> 
> 
> In[20]:= ListPlot[{temp[[All, 1]], temp[[All, 2]]}, PlotStyle -> {Red, Blue},
> PlotRange -> All]
> 
> im Anhang zeigt, dass die Ausreisser bei der Verwendung von AppendTo[] weg sind.
> 
> Anscheinend haben die unnötigen Symbole 'Schiff' und 'Wasser' AppendTo[] mehr zu schaffen gemacht
> als dem Reap/Sow. Gemeinhin reicht es, und so arbeitet auch das Gehirn selber, wenn die Codierung
> so spät wie möglich mitgeteilt wird: 0 -> Wasser, 1 -> Schiff.
> 
> Gruss
> Udo.<gamerKeineAusreisser.jpeg>

Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html