WordPress includes a single global setting for controlling the number of posts that appear on one loop page (under “Blog pages show at most” in the admin”). It is possible to create an action hook that changes / overrides the posts_per_page setting on a case-by-case basis. Best of all, this is done before the query is even executed (so there is no performance cost)!