def primesUpto(x):
    primes = [2]
    sieve = [2]
    i = 3
    while i <= x:
        composite = False
        j = 0
        while j < len(sieve):
            sieve[j] = sieve[j] - 1
            if sieve[j] == 0:
                composite = True
                sieve[j] = primes[j]
            j += 1
        if not composite:
            primes.append(i)
            sieve.append(i*i-i)
        i += 1
    return primes
    
print( len( list( primesUpto( 7919 ))    ))      # 1.41s 7.7 MB
# print( len( list( primesUpto( 17389 ))    ))   # 6.33s 7.8 MB  n^2.15