Python sqrt()将运行时间加倍?

时间:2015-08-14 02:15:23

标签: python runtime primes

我最近开始学习Python。如果这真的很明显,我很抱歉。

我正在关注2008年麻省理工学院计算机科学开放课程,我正在研究计算第1000个素数的问题。 Python 2.7.3,Win7 lappy(咳嗽,咳嗽......)

这是我提出的代码:

num = 3
primeList = [2]

while len(primeList) < 1000:
    for i in primeList:
        if num % i == 0:
            break
    else:
        primeList.append(num)
    num += 1

print "The 1,000th PRIME integer is", primeList[999]

其中一个分配条件是仅检查奇数。鉴于起始num为3,我认为只需将num+=1更改为num+=2即可。值得注意的是:我没有用我编写的详细代码为你烦恼,但在写这篇文章时我使用了一种非常详细的模式来打印每张支票的结果,无论是否为素数,这个数字都在检查中,如果它不是素数和整数,则整数除以它。这样(再次,对不起 - 新B!)

此时我很好奇测试这实际上是否花费了更少的时间进行计算 - 看起来如果有一半的数字被检查为首要,那么它应该花费一半的时间,不是吗?

我导入了时间模块来检查它的持续时间。无论如何,计算到1000都很快,所以我将我搜索的素数增加到了10,000,并没有看到任何显着的差异。在num+=1之间num+=2

import time
start = time.time()

num = 3
primeList = [2]

while len(primeList) < 10000:
    for i in primeList:
        if num % i == 0:
            break
    else:
        primeList.append(num)
    num += 2

print "The 10,000th PRIME integer is", primeList[9999]
end = time.time()
print "That took %.3f seconds" % (end-start)

有时候n+=2甚至会花费几毫秒的时间。 ?。我觉得这很奇怪,想知道是否有人可以帮助我理解为什么 - 或者更重要的是:怎么做?

此外,我接下来导入了sqrt()函数,认为这会减少在确认首要位置之前检查的整数数量,但这会使运行时加倍= ^ O。

import time
start = time.time()

from math import sqrt

num = 3
primeList = [2]

while len(primeList) < 100000:
    for i in primeList:
        if i <= sqrt(num):
            if num % i == 0:
                break
    else:
        primeList.append(num)
    num += 2

print "The 100,000th PRIME integer is",primeList[99999]
end = time.time()
print 'that took', end - start, "seconds, or", (end-start)/60, "minutes"

当然 - 这可能是我编写代码的方式!如果没有,我很好奇我在这里调用了多长时间?

谢谢!

1 个答案:

答案 0 :(得分:1)

两件事。

首先,您在每次循环迭代时计算sqrt(n)。这将增加工作量,因为这是你的代码现在必须在循环的每次传递中做的其他事情。

其次,您使用sqrt的方式不会减少它检查的数字的数量,因为即使i大于sqrt(n),您也不会退出循环。所以它继续为所有较高的数字做一个无操作的循环。

请改为尝试:

while len(primeList) < 100000:
    rootN = sqrt(num)
    for i in primeList:
        if i <= rootN:
            if num % i == 0:
                break
        else:
            primeList.append(num)
            break
    else:
        primeList.append(num)
    num += 2

在我的机器上大约3秒内找到100,000个素数。