Psyco testing feed-back wanted

Jimmy Retzlaff jimmy at retzlaff.com
Fri Aug 23 17:52:53 EDT 2002


Wow!!!

I've seen raves about Psyco, but I hadn't tried it myself until today.
My test case was a function that tests if a point is in a polygon. I
timed several runs with different approaches. All tests are whether 1
point is in a polygon made up of 5,000,000 points. The timing was done
on just the function call itself. Here are some results:

Python (no types declared, floats used) - 14.2 seconds (1x)
Python (no types declared, ints used) - 12.0 seconds (1.2x)
Pyrex (coordinates declared as object, floats used) - 4.8 seconds (3x)
Pyrex (coordinates declared as object, ints used) - 4.7 seconds (3x)
Pyrex (coordinates declared as float) - 2.3 seconds (6x)
Pyrex (coordinates declared as int) - 1.5 seconds (9.5x)
Psyco (no types declared, floats used) - 1.47 (9.5x)
C (coordinates declared as double) - 0.99 seconds (14x)
Psyco (no types declared, ints used) - 0.41 seconds (35x)
C (coordinates declared as unsigned int) - 0.20 seconds (71x)

It's amazing to get this type of code performing this close to C (in
this case VC6 optimized for speed) with no modifications and no type
declarations. For those of you who haven't tried Psycho, here is the
code that had to appear after my function definition:

import psyco
psyco.bind(pointInPolygon)

No other modifications were made to my Python code and Psyco requires no
modification to the Python installation, just drop the Psyco folder into
site-packages. The Python version of the test function is below.

Jimmy


def pointInPolygon((x, y), polygon):
  """Determine if the point (x, y) is in the polygon.

  >>> polygon = [(0, 0), (3, 3), (0, 6), (-3, 3)]
  >>> pointInPolygon((1, 2), polygon)
  1
  >>> pointInPolygon((2, 1), polygon)
  0
  """

  # Algorithm is from http://home.earthlink.net/~bobstein/inpoly
  # also appears at http://www.linuxjournal.com/article.php?sid=2029

  if len(polygon) < 3:
    return False

  result = False
  xOld, yOld = polygon[-1]
  for xNew, yNew in polygon:
    if xNew > xOld:
      if xOld < x <= xNew and (y-yOld)*(xNew-xOld) <
(yNew-yOld)*(x-xOld):
        result = not result
    elif xNew < x <= xOld and (y-yNew)*(xOld-xNew) <
(yOld-yNew)*(x-xNew):
      result = not result

    xOld = xNew
    yOld = yNew

  return result





More information about the Python-list mailing list