def primes(N):
return reduce((lambda r,x: (r.difference_update(range(x**2,N,x)) or r) if (x in r) else r),
# range(2,N), set(range(2,N)))
range(2,int((N+1)**0.5+1)), set(range(2,N)))
print( sorted( list( primes( 100000 )))[-2:] )
# - SQRT - - NO SQRT -
# 100k: time: 0.06s memory: 5924 kB 0.12 7.1
# 200k: time: 0.11s memory: 7232 kB < O(n) !! 0.24 9.6
# 400k: time: 0.20s memory: 9536 kB < O(n) !! 0.46 14.3
# 1m: time: 0.48s memory: 16656 kB < O(n) !!! 1.12 28.4
# 2m: time: 0.97s memory: 28752 kB O(n) !!!
ZGVmIHByaW1lcyhOKToKIHJldHVybiByZWR1Y2UoKGxhbWJkYSByLHg6IChyLmRpZmZlcmVuY2VfdXBkYXRlKHJhbmdlKHgqKjIsTix4KSkgb3IgcikgaWYgKHggaW4gcikgZWxzZSByKSwgCiAgICAgICAgICAgICAgICMgcmFuZ2UoMixOKSwgc2V0KHJhbmdlKDIsTikpKQogICAgICAgICAgICAgICByYW5nZSgyLGludCgoTisxKSoqMC41KzEpKSwgc2V0KHJhbmdlKDIsTikpKQoKcHJpbnQoIHNvcnRlZCggbGlzdCggcHJpbWVzKCAxMDAwMDAgKSkpWy0yOl0gKQoKIyAgICAgICAgICAgICAgICAtIFNRUlQgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTk8gU1FSVCAtCiMgMTAwazogdGltZTogMC4wNnMgICAgbWVtb3J5OiA1OTI0IGtCICAgICAgICAgICAgICAgICAgICAgMC4xMiA3LjEKIyAyMDBrOiB0aW1lOiAwLjExcyAgICBtZW1vcnk6IDcyMzIga0IgICAgIDwgTyhuKSAhISAgICAgICAwLjI0IDkuNgojIDQwMGs6IHRpbWU6IDAuMjBzICAgIG1lbW9yeTogOTUzNiBrQiAgICAgPCBPKG4pICEhICAgICAgIDAuNDYgMTQuMwojIDFtOiAgIHRpbWU6IDAuNDhzICAgIG1lbW9yeTogMTY2NTYga0IgICAgPCBPKG4pICEhISAgICAgIDEuMTIgMjguNAojIDJtOiAgIHRpbWU6IDAuOTdzICAgIG1lbW9yeTogMjg3NTIga0IgICAgICBPKG4pICEhIQ==