How to make this speed up
David M. Cooke
cookedm+news at physics.mcmaster.ca
Tue Mar 30 19:36:19 EST 2004
At some point, claird at lairds.com (Cameron Laird) wrote:
> In article <qnkptauymdq.fsf at arbutus.physics.mcmaster.ca>,
> David M. Cooke <cookedm+news at physics.mcmaster.ca> wrote:
> .
> .
> .
>>Use numarray or Numeric, and use arrays for your points. Also, do you
>>need the distance, or will the square of the distance do? (that'll
>>save you a sqrt).
>>
>>import numarray as NA
>>
>>def distance_between_points(plist):
>> # if plist was a list of N points in d dimensions, p is an array of
>>size (N,d)
>> p = NA.asarray(plist)
>> N, d = p.shape
>> # dist2 is a (N,N) array of squared distance
>> dist2 = NA.zeros((N, N), type=p.type())
>> for i in range(d):
>> dist2 += NA.subtract.outer(p[:,i],p[:,i])**2
>> return NA.sqrt(dist2)
>>
>>This should be almost as fast as writing your own C extension (and
>>much easier...)
> .
> .
> .
> The "much easier" has me curious. While I'm as insistent
> as anyone about Python's universality, this is an area
> where I see it with no advantage over C. The simple-minded
> C homologue requires no memory management or dereferencing,
> at the source level, so it's as easy as C gets. Are you
> simply observing that, when working in Python, any require-
> ment to introduce the machinery necessary for a second
> language makes the problem not easy? Or is there another
> comparison between the two that I haven't noticed?
Well, let me qualify: much easier for me, because
1) I have numarray installed, and am not worried about depending upon
it
2) I know how to use it efficiently
3) I don't have to look up the sequence API. For a C extension, I
presume if you're not using arrays (and lists instead), you'd be
mucking around with pulling things out of lists, and creating a new
one. I can easily imagine that code (with error checks, etc.) getting
to be a few hundred lines. I haven't tried, but Pyrex probably won't
be too much faster either, as it still has to index the lists.
A C extension written to use numarray (or Numeric) arrays will be
shorter and easier to write than the equivalent using lists. I'd first
evaluate whether the procedure I wrote above is "good enough", though.
--
|>|\/|<
/--------------------------------------------------------------------------\
|David M. Cooke
|cookedm(at)physics(dot)mcmaster(dot)ca
More information about the Python-list
mailing list