It's also different. It uses numpy (which is cheating, in a way) but does the job well. I like it because it seems more understandable once you've grasped that the routine doesn't do any division. Instead, it's pure sieve operations on a vector of booleans. Anything found to be divisible by anything other than 1 and itself is marked as False, and the routine finishes by returning the indices of True values - which are primes.
I've triangulated the results by summing them and comparing the sums against those of other routines and there's no differences I've noticed yet.
I'm quite pleased with this early foray into optimising a routine but there's work to do compared to prime6. What I like is that it has no division and instead seems to be a pure sieve and doesn't create a long list of numbers.
I tried other versions with a half-series so that anything divisible by 2 just wasn't considered, but what I came up with just weren't as fast.
Times (msecs, same machine, best of 3-6 multiple runs)
10k 100k 500k 1m 20m
prime6 0.001258 0.002722 0.007229 0.001229 0.22388
erat 0.005414 0.059047 0.333737 0.673749 15+ seconds
ajs_primes3a 0.000360 0.001897 0.008540 0.016952 0.70135