Just thought I would throw in this useful tip...
It turns out Pyglet does an awful lot of OpenGL error checking. This gets turned off if you compile in 'optimized' mode, but you can also configure it as follows:
# Disable error checking for increased performance
pyglet.options['debug_gl'] = False
from pyglet.gl import *
That line needs to be in before you import symbols from pyglet.gl.
Performance improved, um, dramatically. And while trying to figure this out, I also brought in Lepton, a particle engine library for Python, and am pleased with how much better the explosions and smoke look. So pushing at those limits has its uses.