I am assuming that `EvenQ` is merely an example; clearly if you can generate these values directly, e.g. `Range[2, 20, 2]` that will always be preferable. You can do this reasonably efficiently in terms of both syntax and memory by using `Sow` and `Reap`: test = Divisible[#, 1*^6] &; Reap[Do[If[test @ i, Sow @ i], {i, 1*^6}]][[2, 1]] (* Out= *) {1000000, 2000000, 3000000, 4000000, 5000000, 6000000, 7000000, 8000000, 9000000, 10000000} Note that only a small amount of memory is used, unlike the `Table` and `Select` method: MaxMemoryUsed[] > 15467904 If you need greater performance you might make use of a block-based approach as I did for https://mathematica.stackexchange.com/q/21584/121, e.g. block = 100000; Join @@ Table[Select[Range[n block + 1, (n + 1) block], test], {n, 0, 99}] (* Out= *) {1000000, 2000000, 3000000, 4000000, 5000000, 6000000, 7000000, 8000000, 9000000, 10000000} This a bit faster than the first method on my system.