<p>Hi, i only have some questions about your example code. How does the runhooks function work? And what are you using the pos loop variable for?</p>
<div class="gmail_quote">Den 14 aug 2011 18.58 skrev &quot;Timo Paulssen&quot; &lt;<a href="mailto:timonator@perpetuum-immobile.de">timonator@perpetuum-immobile.de</a>&gt;:<br type="attribution">&gt; Hello List,<br>&gt; <br>
&gt; I&#39;m currently experimenting with a piece of software I&#39;ve recently started<br>&gt; maintaining, which is a cellular automaton simulation software. It&#39;s supposed to<br>&gt; make experimenting easy, but still be fast at simulating. As you might know, all<br>
&gt; cellular automatons operate in steps, where usually the whole &quot;configuration<br>&gt; space&quot; is iterated over and all fields are updated depending on their<br>&gt; neighbourhood and the &quot;local transition function&quot;. Currently, the step functions<br>
&gt; are implemented in C and inlined with weave.inline.<br>&gt; <br>&gt; The experiment I just tried out was generating step functions by piecing<br>&gt; together strings of C code. It was quite successful, but I would like to take<br>
&gt; that one step further and use python code instead of having the user write C<br>&gt; code that has to be written with weave in mind.<br>&gt; <br>&gt; The first attempt at making it work with python code was to put python callables<br>
&gt; into lists and running them somewhat like this:<br>&gt; <br>&gt; def step_pure_py(self):<br>&gt;     runhooks(&quot;init&quot;)<br>&gt;     loop_iter = self.loop.get_iter()<br>&gt;     for pos in loop_iter:<br>&gt;         runhooks(&quot;pre_compute&quot;)<br>
&gt;         runhooks(&quot;compute&quot;)<br>&gt;         runhooks(&quot;post_compute&quot;)<br>&gt;     runhooks(&quot;after_step&quot;)<br>&gt; <br>&gt; This is utterly slow, because - even though i turned the lists that contain the<br>
&gt; hooks into tuples - i have no way to tell pypy, that the lists are not going to<br>&gt; be changed and all loops that handle them can safely be unrolled.<br>&gt; <br>&gt; Unrolling the lists by hand gives me insane speedups. These are timings for<br>
&gt; 10.000 steps on a 1000 field array - that is calling step_pure_py 1000 times and<br>&gt; having the loop_iter iterate over 1000 fields each time.<br>&gt; <br>&gt; hand-unrolled python code:<br>&gt; 2.15user 0.01system 0:02.18elapsed 99%CPU (0avgtext+0avgdata 103024maxresident)k<br>
&gt; <br>&gt; hook based solution like above:<br>&gt; 62.57user 0.05system 1:02.79elapsed 99%CPU (0avgtext+0avgdata 184576maxresident)k<br>&gt; <br>&gt; So what would you suggest for making this much faster? I read on the IRC, that<br>
&gt; in pypy itself, string concatenation is actually used to create python<br>&gt; functions, so maybe that would be way to go in this case? Or could pypy offer<br>&gt; decorators or other hints to cause pypy to unroll and constant-fold different<br>
&gt; things for me?<br>&gt; <br>&gt; Thank you<br>&gt;   - Timo Paulssen<br>&gt; _______________________________________________<br>&gt; pypy-dev mailing list<br>&gt; <a href="mailto:pypy-dev@python.org">pypy-dev@python.org</a><br>
&gt; <a href="http://mail.python.org/mailman/listinfo/pypy-dev">http://mail.python.org/mailman/listinfo/pypy-dev</a><br></div>