Hi,<br><br>This is a know fact, you should use Python default functions if you have only one value.<br>If Numpy uses math.sqrt for floatting point number, it would have to use cmath for complex values as well. Now, I don&#39;t know if an additionnal test will slow down Numpy, if this is the case, then we should stay with the current situation ; if I have a signle value to compute, I always use math instead of Numpy.
<br><br>Matthieu<br><br><div><span class="gmail_quote">2007/12/29, Bruce Sherwood &lt;<a href="mailto:Bruce_Sherwood@ncsu.edu">Bruce_Sherwood@ncsu.edu</a>&gt;:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On the VPython list Scott Daniels suggested using try/except to deal<br>with the problem of sqrt(5.5) being numpy.float64 and thereby making<br>sqrt(5.5)*(VPython vector) not a (VPython vector), which ends up as a<br>big performance hit on existing programs. I tried his suggestion and did
<br>some timing using the program shown below.<br><br>Using &quot;from numpy import *&quot;, the numpy sqrt(5.5) gives 5.7 microsec per<br>sqrt, whereas using &quot;from math import *&quot; a sqrt is only 0.8 microsec.<br>
Why is numpy so much slower than math on this simple case? For<br>completeness I also timed the old Numeric sqrt, which was 14 microsec,<br>so numpy is a big improvement, but still very slow compared to math.<br><br>Using Daniels&#39;s suggestion of first trying the math sqrt, falling
<br>through to the numpy sqrt only if the argument isn&#39;t a simple scalar,<br>gives 1.3 microsec per sqrt on the simple case of a scalar argument.<br>Shouldn&#39;t/couldn&#39;t numpy do something like this internally?<br>
<br>Bruce Sherwood<br><br>----------------------------<br>from math import *<br>mathsqrt = sqrt<br>from numpy import *<br>numpysqrt = sqrt<br>from time import clock<br><br># 0.8 microsec for &quot;raw&quot; math sqrt<br># 
5.7 microsec for &quot;raw&quot; numpy sqrt<br># 1.3 microsec if we try math sqrt first<br><br>def sqrt(x):<br>&nbsp;&nbsp;&nbsp;&nbsp;try: return mathsqrt(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;except TypeError: return numpysqrt(x)<br><br># Check that numpy sqrt is invoked on an array:
<br>nums = array([1,2,3])<br>print sqrt(nums)<br><br>x = 5.5<br>N = 500000<br>t1 = clock()<br>for n in range(N):<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)
<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;y = sqrt(x)<br>t2 = clock()<br>for n in range(N):<br>&nbsp;&nbsp;&nbsp;&nbsp;pass<br>t3 = clock()<br># t3-t2 is the loop overhead (turns out negligible)<br>print &quot;%i loops over 10 sqrt&#39;s takes %.1f seconds&quot; % (N,t2-t1)
<br>print &quot;Total loop overhead = %.2f seconds (negligible)&quot; % (t3-t2)<br>print &quot;One sqrt takes %.1f microseconds&quot; % (1e6*((t2-t1)-(t3-t2))/(10*N))<br><br><br>_______________________________________________
<br>Numpy-discussion mailing list<br><a href="mailto:Numpy-discussion@scipy.org">Numpy-discussion@scipy.org</a><br><a href="http://projects.scipy.org/mailman/listinfo/numpy-discussion">http://projects.scipy.org/mailman/listinfo/numpy-discussion
</a><br></blockquote></div><br><br clear="all"><br>-- <br>French PhD student<br>Website : <a href="http://matthieu-brucher.developpez.com/">http://matthieu-brucher.developpez.com/</a><br>Blogs : <a href="http://matt.eifelle.com">
http://matt.eifelle.com</a> and <a href="http://blog.developpez.com/?blog=92">http://blog.developpez.com/?blog=92</a><br>LinkedIn : <a href="http://www.linkedin.com/in/matthieubrucher">http://www.linkedin.com/in/matthieubrucher
</a>