A significant performance boost is achievable by caching intermediate render results in your render function's dependencies. For an RTS-type map, you'd then go render the map once when loading, instead of every frame and save the amount of work to be done. You might even want to passively detect dependencies and evaluate what parts of your render pipe need to be updated with reasonable performance. Which brings me to another suggestion: Do we want this kind of infrastructure in a pygame.RenderSurface? - that would have a rect position, maybe a target surface and a subsurface state stored and pygame would figure out internally what it takes for an update based on what was changed.
Sorry for ridiculing the original post. I was tired and OP made it sound like homework for someone else, which happens far too often in many projects. cheers! mar77i