Does PostgreSQL do any kind of caching of query results on its own?
It will execute it each time.  It will cache the data it needs to do the execution (assuming that is small enough to stay in cache), but not the results.  Who knows, maybe the results have even changed, what with other people being allowed to do inserts, updates, and deletions at the same time as you are looping over your 10,000 executions.