<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Patrick,<br>
<br>
I pulled down the gist code to run the cython annotate on it, and<br>
found that there were some declarations missing. I added these at the<br>
top of the file:<br>
<br>
ctypedef np.float64_t DTYPE64_t<br>
DTYPE64 = np.float<br>
from libc.math cimport exp, sin, cos<br>
<br>
And it compiles and looks OK to me; there isn&#39;t anything obvious that<br>
would make it slow. However, depending on how you defined exp, sin,<br>
cos, in the file you are actually running, if you are linking those<br>
back to the numpy versions instead of the C versions, this code would<br>
be pretty slow.<br></blockquote><div><br></div><div>Hi, Aronne,</div><div><br></div><div>Thanks for the great response. I really appreciate You did catch a couple of declarations I missed when posting the gist. (I created the gist from a module I have, and forgot to copy all of the header stuff.) I&#39;ve fixed that now, but essentially I declare exp, cos, sin, and fabs as:</div>

<div><br></div><div><pre style="margin-top:0px;margin-bottom:0px;padding:0px;font-size:12px;line-height:1.4em;font-family:&#39;Bitstream Vera Sans Mono&#39;,Courier,monospace;text-align:left"><div class="line" id="LC5" style="margin:0px;padding:0px 0px 0px 1em;line-height:1.4em">

<span class="k" style="margin:0px;padding:0px;line-height:1.4em;font-weight:bold">cdef</span> <span class="kr" style="margin:0px;padding:0px;line-height:1.4em;font-weight:bold">extern</span> <span class="k" style="margin:0px;padding:0px;line-height:1.4em;font-weight:bold">from</span> <span class="s" style="margin:0px;padding:0px;line-height:1.4em;color:rgb(221,17,68)">&#39;math.h&#39;</span><span class="p" style="margin:0px;padding:0px;line-height:1.4em">:</span></div>

<div class="line" id="LC6" style="margin:0px;padding:0px 0px 0px 1em;line-height:1.4em">    <span class="nb" style="margin:0px;padding:0px;line-height:1.4em;color:rgb(0,134,179)">float</span> <span class="n" style="margin:0px;padding:0px;line-height:1.4em">exp</span><span class="p" style="margin:0px;padding:0px;line-height:1.4em">(</span><span class="nb" style="margin:0px;padding:0px;line-height:1.4em;color:rgb(0,134,179)">float</span> <span class="n" style="margin:0px;padding:0px;line-height:1.4em">x</span><span class="p" style="margin:0px;padding:0px;line-height:1.4em">)</span></div>

<div class="line" id="LC7" style="margin:0px;padding:0px 0px 0px 1em;line-height:1.4em">    <span class="nb" style="margin:0px;padding:0px;line-height:1.4em;color:rgb(0,134,179)">float</span> <span class="n" style="margin:0px;padding:0px;line-height:1.4em">cos</span><span class="p" style="margin:0px;padding:0px;line-height:1.4em">(</span><span class="nb" style="margin:0px;padding:0px;line-height:1.4em;color:rgb(0,134,179)">float</span> <span class="n" style="margin:0px;padding:0px;line-height:1.4em">x</span><span class="p" style="margin:0px;padding:0px;line-height:1.4em">)</span></div>

<div class="line" id="LC8" style="margin:0px;padding:0px 0px 0px 1em;line-height:1.4em">    <span class="nb" style="margin:0px;padding:0px;line-height:1.4em;color:rgb(0,134,179)">float</span> <span class="n" style="margin:0px;padding:0px;line-height:1.4em">sin</span><span class="p" style="margin:0px;padding:0px;line-height:1.4em">(</span><span class="nb" style="margin:0px;padding:0px;line-height:1.4em;color:rgb(0,134,179)">float</span> <span class="n" style="margin:0px;padding:0px;line-height:1.4em">x</span><span class="p" style="margin:0px;padding:0px;line-height:1.4em">)</span></div>

<div class="line" id="LC9" style="margin:0px;padding:0px 0px 0px 1em;line-height:1.4em">    <span class="nb" style="margin:0px;padding:0px;line-height:1.4em;color:rgb(0,134,179)">float</span> <span class="n" style="margin:0px;padding:0px;line-height:1.4em">fabs</span><span class="p" style="margin:0px;padding:0px;line-height:1.4em">(</span><span class="nb" style="margin:0px;padding:0px;line-height:1.4em;color:rgb(0,134,179)">float</span> <span class="n" style="margin:0px;padding:0px;line-height:1.4em">x</span><span class="p" style="margin:0px;padding:0px;line-height:1.4em">)</span></div>

</pre></div><div><br></div><div>Is the way you define the math functions better/faster? My (limited) thinking is that your method and my method achieve the same thing, but my understanding of Cython is simply from hacking around with it and could easily be in err.</div>

<div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Otherwise, just after skimming the cython code, it looks like the<br>
gaussian kernel (partweight in the cython code) is fixed, so this is<br>
really just a convolution. If you compute partweight once, in python,<br>
then you can just use the convolution function in scipy. This should<br>
be as fast as any simple cython code, I&#39;d think, and it is a lot<br>
simpler.<br></blockquote><div><br></div><div><br></div><div>When I first wrote this code (a couple of years ago) I didn&#39;t know about convolutions. However, as I&#39;m learning about them, I see that what I&#39;m doing really is a convolution. My attempts to use the convolution function in scipy is slower than my Cython code. Maybe I&#39;m doing something wrong? The line below is how I&#39;m calling the convolution:</div>

<div><br></div><div>smooth_hist = ndimage.filters.convolve(data, weights, mode=&#39;constant&#39;, cval=0.0, origin=0)</div><div><br></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

If you try that, is it enough? If not, can you be more specific as to<br>
what cases you have where the performance is bad? Specifically: what<br>
size is the data array? what size is the kernel? what number of points<br>
are non zero in the data array?<br></blockquote><div><br></div><div><br></div><div>Currently I&#39;m using this on a grid that&#39;s approxiately 800x600 with a kernel of about half that (Gaussian function with sigma of ~40km). This grid is essentially the eastern half of the United States at a grid spacing of 4km. On this grid, the Cython code is plenty fast. However, as I move toward dealing with finer meshes, my grid goes from 800x600 to closer to 5000x3000. Again, when dealing with binary, discrete data, the Cython routine is fairly quick. However, as the data become closer to continuous fields (say a temperature field instead of tornado tracks), the Cython code&#39;s performance decreases fairly quickly. When compared to using Gaussian filters (which I understand to be convolutions), the Cython code is substantially slower. The Cython code is still significantly slower than my workflow of &quot;rotate, use gaussian filter, rotate back&quot;. The problem with the rotate workflow is that I&#39;m uncomfortable with losing data in the rotations.</div>

<div><br></div><div>(To see one application of what I&#39;m doing, here&#39;s a paper in Weather and Forecasting describing what I&#39;m doing: <a href="http://www.patricktmarsh.com/research/pubs/refereed/marshetal2012_precip.pdf">http://www.patricktmarsh.com/research/pubs/refereed/marshetal2012_precip.pdf</a>)</div>

<div><br></div><div>I&#39;m currently proceeding with the Cython code as it&#39;s sufficient for what I&#39;m doing right now. However, I was thinking of down the road. I wasn&#39;t sure where Scipy&#39;s Gaussian filters were getting such a bigger speed up than my Cython code.</div>

<div><br></div><div>Thanks again</div><div>Patrick</div></div>