import math
def is_prime(n):
if n < 2: return False
if n == 2: return True
if n % 2 == 0: return False
for i in range(3, int(n/2) + 1, 2): # int(math.sqrt(num))
if n % i == 0:
return False
return True
def sum_prime(num):
if num < 2:
return 0
sum_p = 2
prime_lis = []
suspected = set(range(3, num + 1, 2))
for i in range(3, int(math.sqrt(num)) + 1, 2):
if is_prime(i):
prime_lis.append(i)
for p in prime_lis:
sum_p += p
suspected.difference_update(set(range(p, num + 1, p)))
return sum(suspected) + sum_p
print sum_prime(2000000)
aW1wb3J0IG1hdGgKCmRlZiBpc19wcmltZShuKToKICAgIGlmIG4gPCAyOiByZXR1cm4gRmFsc2UKICAgIGlmIG4gPT0gMjogcmV0dXJuIFRydWUKICAgIGlmIG4gJSAyID09IDA6IHJldHVybiBGYWxzZQogICAgZm9yIGkgaW4gcmFuZ2UoMywgaW50KG4vMikgKyAxLCAyKTogICAjIGludChtYXRoLnNxcnQobnVtKSkKICAgICAgICBpZiBuICUgaSA9PSAwOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgpkZWYgc3VtX3ByaW1lKG51bSk6CiAgICBpZiBudW0gPCAyOgogICAgICAgIHJldHVybiAwCiAgICBzdW1fcCA9IDIKICAgIHByaW1lX2xpcyA9IFtdCiAgICBzdXNwZWN0ZWQgPSBzZXQocmFuZ2UoMywgbnVtICsgMSwgMikpCiAgICBmb3IgaSBpbiByYW5nZSgzLCBpbnQobWF0aC5zcXJ0KG51bSkpICsgMSwgMik6ICAgCiAgICAgICAgaWYgaXNfcHJpbWUoaSk6CiAgICAgICAgICAgIHByaW1lX2xpcy5hcHBlbmQoaSkKICAgIGZvciBwIGluIHByaW1lX2xpczoKICAgICAgICBzdW1fcCArPSBwCiAgICAgICAgc3VzcGVjdGVkLmRpZmZlcmVuY2VfdXBkYXRlKHNldChyYW5nZShwLCBudW0gKyAxLCBwKSkpCiAgICByZXR1cm4gc3VtKHN1c3BlY3RlZCkgKyBzdW1fcAoKcHJpbnQgc3VtX3ByaW1lKDIwMDAwMDAp
MjAwazogMC4wOXMgOC4zIE1CCjQwMGs6IDAuMTlzIDcuOCBNQiAgICAgKHRlc3RzIGRvbmUgd2l0aCBzcXJ0IG9uIGxpbmUgIzcsIHNvIG5vIGRpZmZlcmVuY2UhKQo4MDBrOiAwLjQ4cyA4LjkgTUIgICAKMm1sbjogMS4xNXMgOC4wIE1CICAgbl4wLjk1ICBuXjEuMSAgbl4xLjEgICAoZW1waXJpY2FsIG9yZGVycyBvZiBncm93dGggY29tcGF0aWJsZSB3aXRoIGBuIGxvZyhsb2cgbilgKQ==
200k: 0.09s 8.3 MB
400k: 0.19s 7.8 MB (tests done with sqrt on line #7, so no difference!)
800k: 0.48s 8.9 MB
2mln: 1.15s 8.0 MB n^0.95 n^1.1 n^1.1 (empirical orders of growth compatible with `n log(log n)`)