EDIT:
I profiled my code, and here are some of the highest numbers
map size 40 x 40 tiles:
4606119 function calls (4606113 primitive calls) in 145.974 seconds
ncalls tottime percall cumtime percall filename:lineno(function)
127128 0.225 0.000 0.225 0.000 vec2d.py:18(__len__)
218530 1.406 0.000 1.406 0.000 geometrical.py:64(__init__)
253534 0.544 0.000 0.544 0.000 vec2d.py:21(__getitem__)
1400934 2.309 0.000 2.309 0.000 {method 'append' of 'list' objects}
2086545 64.417 0.000 64.435 0.000 {method 'blit' of 'pygame.Surface' objects}
So it appears a lot of time is spent appending items to lists, but I'm not what kind of other, more efficient method of organizing my game there is. As expected however, blitting pygame surfaces trumps the other functions by a huge factor, as shown by the cumtime (whatever that is).
So I guess the question is the same, can pygame be replaced by something, or might there be a more shallow problem in my code still?