Python中首选发现算法的运行时间

时间:2019-03-06 07:09:53

标签: python algorithm runtime primes

问题:

我有以下任务:

  

[...]编写一个程序,该程序接收大于1的正整数并验证它是素数还是复合数。

解决方案:

我想出了以下几点:

n=int(input())
flag=True
for i in range(2,n//2+2):
    if n%i==0:
        print("Not prime.")
        flag=False
        break
if flag==True:
    print("Prime.")

这似乎是正确的。然后,我决定尝试一下它,看看使用大整数输入会如何工作, 10 ^ 9 + 7 看起来是一个不错的选择。但是,该程序似乎根本无法完成运行,并且一直运行了30秒钟以上,直到我决定终止它。

但是,考虑到算法中的循环最多运行〜 5 * 10 ^ 8 次,并考虑到现代计算机在一秒钟内可以进行的大量计算,运行时间不是很长吗?

这是怎么回事?

在Python中, 10 ^ 9 + 7 是否像在C中一样作为int类型计算的“上限”,因此以某种方式“溢出了计算” ?还是我的算法有问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

当然,在像Python这样的解释语言中,事情会变慢-与等效的C实现相比,有时您可能会失去一两个数量级的性能。但是,您的算法在渐近性上远远超出了必需的算法。您的算法是O(n),但是仅检查直到n的平方根的除数,就可以实现O(sqrt(n))的时间。您还可以通过实施车轮分解来将其以某些恒定因素加速。轮子{2, 3}{2, 3, 5}相当普遍,但是当您在轮子上添加更多的质数时,收益会递减。使用{2}滚轮使事情保持简单,我们可以跳过所有偶数(除2外),因为它们都不是质数。

def is_prime(n):
    if n < 3:
        return n == 2
    if not n % 2:
        return False

    for i in range(3, int(n ** 0.5) + 2, 2):
        if not n % i:
            return False
    return True