So I made a backup copy of the code and spent an hour or two trying out Cython.
Cython (which is different from CPython) is another compiler for Python. Unlike Psyco or PyPy, it isn't a JIT compiler; it turns Python code into C, and it works on the module level, which requires some elementary reorganization to use. Not only does it promise some basic speed increase just from the conversion, it is possible to supply some explicit type information to optimize the resulting code still further. Since that type info is added to the language in the form of new keywords, that has the disadvantage of making the code no longer runnable as pure Python.
The big surprise with Cython is: I got it to work. There are no Python features in my code that it doesn't support. This, by itself, is a surprise, and after my latest failures in getting outside code working it gives me a warm feeling to use one of these tools and not be faced with any error messages that I can't fix myself.
Unfortunately, I didn't get any observed speed benefit from it; the framerate actually dipped a little bit. Still, the relative lack of impossible-to-fix errors is encouraging, and I might play around with this a bit more later.
In the meantime, the thing I can do to improve performance the most is probably to either optimize the cell sort or switch to a different cell calculation selection mechanism. That's what I'll be working on tomorrow.