def primes(N):
return reduce((lambda r,x: (r.difference_update(range(x*x,N,2*x)) or r)
if (x in r) else r),
range(3,int((N+1)**0.5+1),2), set([2]+range(3,N,2)))
print( sorted( list( primes( 400000 )))[-2:] )
# 100k: time: 0.04s memory: 5660 kB
# 200k: time: 0.07s memory: 6520 kB
# 400k: time: 0.13s memory: 7388 kB
# 1m: time: 0.30s memory: 10680 kB < O(n) !!!!
# 2m: time: 0.60s memory: 16736 kB n^1.0 !!!
# 4m: time: 1.23s memory: 28776 kB O(n^1.04) !!
ZGVmIHByaW1lcyhOKToKIHJldHVybiByZWR1Y2UoKGxhbWJkYSByLHg6IChyLmRpZmZlcmVuY2VfdXBkYXRlKHJhbmdlKHgqeCxOLDIqeCkpIG9yIHIpCiAgICAgICAgICAgICAgICAgIGlmICh4IGluIHIpIGVsc2UgciksIAogICAgICAgICAgICAgICByYW5nZSgzLGludCgoTisxKSoqMC41KzEpLDIpLCBzZXQoWzJdK3JhbmdlKDMsTiwyKSkpCgpwcmludCggc29ydGVkKCBsaXN0KCBwcmltZXMoIDQwMDAwMCApKSlbLTI6XSApCgojIDEwMGs6ICB0aW1lOiAwLjA0cyAgICBtZW1vcnk6IDU2NjAga0IgCiMgMjAwazogIHRpbWU6IDAuMDdzICAgIG1lbW9yeTogNjUyMCBrQgojIDQwMGs6ICB0aW1lOiAwLjEzcyAgICBtZW1vcnk6IDczODgga0IKIyAxbTogICAgdGltZTogMC4zMHMgICAgbWVtb3J5OiAxMDY4MCBrQiAgICA8IE8obikgICAgISEhIQojIDJtOiAgICB0aW1lOiAwLjYwcyAgICBtZW1vcnk6IDE2NzM2IGtCICAgICAgbl4xLjAgICAhISEKIyA0bTogICAgdGltZTogMS4yM3MgICAgbWVtb3J5OiAyODc3NiBrQiAgICBPKG5eMS4wNCkgISE=