You can use this code to profile your pygame at the python level. With it you can find out the bits that are slowing down your game. If your game is going too slow, you will be able to find out what areas to improve.
If your main loop is not already in a main() function, just put it in one, and add the stuff below to your game.
def main(): for x in range(10000): pass import cProfile as profile profile.run('main()')
Warning: the hotshot module has some bugs and may produce incorrect timings. Read the a python-dev mailing list thread titled "s/hotshot/lsprof" for details. It's better to use cProfile if you have python2.5+
import traceback,sys def slow_function(): # your code goes here. for x in range(10000): pass def main(): # your code goes here. slow_function() if __name__ == "__main__": if "profile" in sys.argv: import hotshot import hotshot.stats import tempfile import os profile_data_fname = tempfile.mktemp("prf") try: prof = hotshot.Profile(profile_data_fname) prof.run('main()') del prof s = hotshot.stats.load(profile_data_fname) s.strip_dirs() print "cumulative\n\n" s.sort_stats('cumulative').print_stats() print "By time.\n\n" s.sort_stats('time').print_stats() del s finally: # clean up the temporary file name. try: os.remove(profile_data_fname) except: # may have trouble deleting ;) pass else: try: main() except: traceback.print_exc(sys.stderr)
Or if you're too lazy to copy all that in, this works as well (although not quite as fancily.)
Or you can use the @profile decorator from the profilehooks module by Marius Gedminas.
from profilehooks import profile @profile def main(): ... # your code here if __name__ == '__main__': main()