I'm currently syncing from scratch, and noticed that the first million blocks or so synced really fast, but the final blocks take forever. Why is this?
The speed of transaction validation was reduced with the activation of RingCT at block height 1220517 in early January.
Although RingCT transactions still take longer to validate than pre RingCT transactions, the difference in performance was significantly reduced with the 10.2.1 release that went live this week. Further improvements are expected, the extent of which are yet to be determined.
The main reason for the difference is that the binary contains a list of expected historical block hashes till height 1.2 million, which allows some checks to be skipped if the block is known good. PoW check is still done regardless, so you're sure to get the longest chain.
There are other lesser reasons why speed changes based on where you are in the blockchain. Early blocks contain lots of small transasctions from pools, for instance, and are slower to go through than they would otherwise be. The switch to Ring CT made verification somewhat slower. But these differences are dwarfed by the block hashes.