To find first N prime numbers in python

前端 未结 29 2219
醉梦人生
醉梦人生 2020-11-28 06:56

I am new to the programming world. I was just writing this code in python to generate N prime numbers. User should input the value for N which is the total number of prime n

29条回答
  •  春和景丽
    2020-11-28 07:54

    For reference, there's a pretty significant speed difference between the various stated solutions. Here is some comparison code. The solution pointed to by Lennart is called "historic", the one proposed by Ants is called "naive", and the one by RC is called "regexp."

    from sys import argv
    from time import time
    
    def prime(i, primes):
        for prime in primes:
            if not (i == prime or i % prime):
                return False
        primes.add(i)
        return i
    
    def historic(n):
        primes = set([2])
        i, p = 2, 0
        while True:
            if prime(i, primes):
                p += 1
                if p == n:
                    return primes
            i += 1
    
    def naive(n):
        from itertools import count, islice
        primes = (n for n in count(2) if all(n % d for d in range(2, n)))
        return islice(primes, 0, n)
    
    def isPrime(n):
        import re
        # see http://tinyurl.com/3dbhjv
        return re.match(r'^1?$|^(11+?)\1+$', '1' * n) == None
    
    def regexp(n):
        import sys
        N = int(sys.argv[1]) # number of primes wanted (from command-line)
        M = 100              # upper-bound of search space
        l = list()           # result list
    
        while len(l) < N:
            l += filter(isPrime, range(M - 100, M)) # append prime element of [M - 100, M] to l
            M += 100                                # increment upper-bound
    
        return l[:N] # print result list limited to N elements
    
    def dotime(func, n):
        print func.__name__
        start = time()
        print sorted(list(func(n)))
        print 'Time in seconds: ' + str(time() - start)
    
    if __name__ == "__main__":
        for func in naive, historic, regexp:
            dotime(func, int(argv[1]))
    

    The output of this on my machine for n = 100 is:

    naive
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541]
    Time in seconds: 0.0219371318817
    historic
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541]
    Time in seconds: 0.00515413284302
    regexp
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541]
    Time in seconds: 0.0733318328857
    

    As you can see, there's a pretty big discrepancy. Here it is again for 1000 (prime outputs removed):

    naive
    Time in seconds: 1.49018788338
    historic
    Time in seconds: 0.148319005966
    regexp
    Time in seconds: 29.2350409031
    

提交回复
热议问题