This is because .rotate() creates a new surface, an expensive operation. [similar to if you had a image.load() every game loop. ]
What you can do is rotate the image, and save it as a single image containing all rotations like a spritesheet. Or one image per rotation. Doesn't matter. [You can automate this in pygame, or other apps.]
However, the solution could be to use OpenGL to render in 2D.
For every 'sprite' You create a mesh/rect, and set it's texture to the ball sprite. At render you rotate the square to the angle.
If you haven't used openGL, you are able to create a window with Pygame and PyOpenGL.
There's a couple OpenGL recipies
http://www.pygame.org/wiki/CookBook ,
http://pyopengl.sourceforge.net/documentation/index.html