【问题标题】:I have 2 codes in Python that use to find prime number. Why do in these 2 codes, one produces results much faster than other我在 Python 中有 2 个用于查找素数的代码。为什么在这两个代码中,一个产生的结果比另一个快得多
【发布时间】:2019-09-16 13:35:37
【问题描述】:

我已经编写了程序来查找素数,使用尽可能多的技术来查找素数。然而,当我在互联网上搜索时(在 GeekforGeek 上),我发现了一个与我的有点相似(算法思想相同),但产生相同结果的速度要快得多。我想知道这两者有什么区别

我们都将测试减少 1) 只检查奇数。 2)只有奇数的除数 3)只允许除数达到该数的平方根

#my code
import time
import math
start = time.time()
upperlimit = 1000000 
counter = 1
number = 3
while number<upperlimit: #loop to check number
    shittyvalue = 0
    division = 3
    while math.sqrt(number) >= division: # conditional loop
        if number % division == 0:
            shittyvalue = 1 #for giving the annoucement on whether this number is a prime
            break
        division = division + 2
    if shittyvalue == 0:
        counter = counter + 1
    number = number + 2
print ("There are ",counter, " prime numbers")
end = time.time()
print ("Found in ",end-start, " seconds")
#GeekforGeek code's
# Python Program to find prime numbers in a range 
import math 
import time 

def is_prime(n): 
    if n <= 1: 
        return False
    if n == 2: 
        return True
    if n > 2 and n % 2 == 0: 
        return False
    max_div = math.floor(math.sqrt(n)) 
    for i in range(3, 1 + max_div, 2): 
        if n % i == 0: 
            return False
    return True

# Driver function 
t0 = time.time() 
c = 0 #for counting 

for n in range(1,1000000): 
    x = is_prime(n) 
    c += x 
print("Total prime numbers in range :", c) 

t1 = time.time() 
print("Time required :", t1 - t0) 

显示的结果:

我的:有 78498 个素数 在 17.29092025756836 秒内找到

GeekforGeek 的:范围内的素数总数:78498 所需时间:3.9572863578796387

【问题讨论】:

标签: python performance primes


【解决方案1】:

您可以将 Math.sqrt(number) 从 while 循环中取出。当 n 很大时,这是一个繁重的操作。

Python 中的 for 循环比 while 循环快 Why is looping over range() in Python faster than using a while loop?

【讨论】:

    【解决方案2】:

    有两个主要原因。

    1) math.sqrt(number) 被重复执行。

    2) whilefor:

    import time
    
    upper_limit = 1000000
    
    
    def test_while_loop():
        start = time.time()
    
        sum = 0
    
        idx = 0
        while idx < upper_limit:
            sum += idx
            idx += 2
    
        end = time.time()
    
        print("Found in", end - start, " seconds")
        print("Sum", sum)
    
    
    test_while_loop()
    
    
    def test_for_loop():
        start = time.time()
    
        sum = 0
    
        for idx in range(0, upper_limit, 2):
            sum += idx
    
        end = time.time()
    
        print ("Found in", end - start, " seconds")
        print("Sum", sum)
    
    
    test_for_loop()
    

    输出(每次运行都会不同,但请尝试观察差异):

    Found in 0.0648810863494873  seconds
    Sum 249999500000
    Found in 0.02890491485595703  seconds
    Sum 249999500000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      相关资源
      最近更新 更多