Dynamic or not?

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Wed Dec 12 23:33:55 EST 2007


On Wed, 12 Dec 2007 19:18:20 -0800, rishiyoor wrote:

> I'm trying to write a program that will find the distance between two
> groups of points in space, which have cartesian co-ordinates X,Y and Z.
> 
> I need to find the distances between each point in one group and every
> point in the other group. So if group 1 has 6 points and group 2 had 8
> points, I will calculate 6 x 8 = 48 distances. But I do not know the
> number of points the user will want to use. It is typically between 50
> and 500 in both groups combined, but may be more. Since the memory
> required for the distances will be much larger than the points
> themselves, I am wondering if I will have to allocate memory dynamically
> or if there are easier ways of solving such problems in Python.

Writing in Python, you never need to manually allocate memory. Sometimes, 
for especially complicated data structures, you need to take care about 
_de_allocating memory, but that's rare.

In this case, you may not have enough memory to calculate all the 
combinations at once, so you should consider an iterator-based solution. 
Read up on generators and iterators.

points1 = [ (1.2, 3.4), (5.7, 9.2) ]
points2 = [ (-6.3, 0.0), (14.1, -7.8), (2.6, 12.8) ]

import math
def distance(p1, p2):
    return math.hypot(p1[0]-p2[0], p1[1]-p2[1])

def distances(list1, list2):
    """Yield the distances from every pair of points."""
    for pt1 in list1:
        for pt2 in list2:
            yield distance(pt1, pt2)


Now, if you want the distances one at a time you do this:

>>> D = distances(points1, points2)
>>> for d in D:
...     print d
...
8.23468275042
17.0836178838
9.50368349641
15.1208465371
18.9620673978
4.75078940809


and if you want them all at once, you can do this:

>>> list(distances(points1, points2))
[8.2346827504160718, 17.083617883809037, 9.5036834964133785, 
15.120846537148639, 18.962067397834023, 4.7507894080878819]



-- 
Steven



More information about the Python-list mailing list