On Tue, 14 Apr 2015 08:35 pm, Rustom Mody wrote: > On Tuesday, April 14, 2015 at 8:12:17 AM UTC+5:30, Paul Rubin wrote: >> Steven D'Aprano writes: >> > http://code.activestate.com/recipes/577821-integer-square-root-function/ >> >> The methods there are more "mathematical" but probably slower than what >> I posted. >> >> Just for laughs, this prints the first 20 primes using Python 3's >> "yield from": >> >> import itertools >> >> def sieve(ps): >> p = ps.__next__() >> yield p >> yield from sieve(a for a in ps if a % p != 0) >> >> primes = sieve(itertools.count(2)) >> print(list(itertools.islice(primes,20))) >> >> It's not that practical above a few hundred primes, probably. > > Upto 490 its instantaneous
Not really instantaneous. py> with Stopwatch(): ... x = list(itertools.islice(sieve(itertools.count(2)), 499)) ... time taken: 0.086171 seconds py> from pyprimes import primes py> with Stopwatch(): ... y = list(itertools.islice(primes(), 499)) ... time taken: 0.002802 seconds py> x == y True I have to admit, I expected it to be significantly slower than it actually is. Just goes to show, I've been using Python for 15+ years and my intuition as to what is fast and what is slow is still mediocre at best. Any beginner who thinks they can optimize code without measuring it first is deluding themselves. -- Steven -- https://mail.python.org/mailman/listinfo/python-list