return a generator, not a list (60s faster)