Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何加快基本查找过程?_Python_Loops_Primes - Fatal编程技术网

Python 如何加快基本查找过程?

Python 如何加快基本查找过程?,python,loops,primes,Python,Loops,Primes,我在做Euler项目的第7题时遇到了一个问题。我的代码需要很长时间才能完成。这是我的密码 def Problem7(): num=0 p=0 而p

我在做Euler项目的第7题时遇到了一个问题。我的代码需要很长时间才能完成。这是我的密码

def Problem7():
num=0
p=0
而p<10002:
素数=真
对于范围内的i(2,num):
如果(num%i==0):
素数=假
如果为素数:
打印(个)
p=p+1
num=num+1
问题7()

我如何使它更快?还有其他方法吗?

你应该让你的生活更轻松,并在最后打印素数,我怀疑p变量正在存储这个素数

如评论中所述,您可以使用更智能的算法消除大量计算

1:检查数字是否为偶数(num%2)(如果是,则不是素数)

2:当除数小于或等于平方根且素数==真时,测试除数

3:如果仍然不是素数,则增加2,以便只测试奇数(所有偶数都使用num%2进行检查)

如果您想获得超高效,每个非素数的数字都至少有一个素数因子,因此您可以存储在数组中找到的每个素数,并且只检查数组中最高的素数。。。但这是很多额外的编码,对于这个问题来说是不必要的。使用上述逻辑,我在测试运行的几秒钟内找到了前10000个素数


如果你想到数字100,你的逻辑测试99个可能的除数。上述逻辑仅测试2次,然后停止。求平方根的最坏情况只有2,3,5,7,9。。。5次计算,而不是99次。

我使用以下方法检查数字是否为素数(以0m0.612s为单位运行):

导入数学
def是_prime(num):
如果num==0或num==1:
返回错误
如果num==2:
返回真值
温度=2
当温度<数学sqrt(数值)+1时:
如果num%temp==0:
返回错误
温度+=1
返回真值

这是python2.x还是python3.x?对于python2.x来说,一个真正快速的优化是从
range
切换到
xrange
。在这个实现中,有几件事情没有多大意义:(1)在查找除数时,您可以停在正在测试的数字的平方根处。如果任何大于这个的东西是一个除数,那么必须有一个相应的较小的除数。(2) 找到除数后,立即退出循环(即,
break
)。一旦你找到了,为什么还要继续寻找呢?(3) 唯一需要作为除数测试的偶数是2。之后,您可以跳过所有偶数。其他的速度改进是可能的,但我列出的那些都是微不足道的。将每一个数字除以所有的数字,然后对大素数来说,这需要很长时间。
import math

def is_prime(num):
    if num == 0 or num == 1:
        return False
    if num == 2:
        return True
    temp = 2
    while temp < math.sqrt(num) + 1:
        if num % temp == 0:
            return False
        temp += 1

    return True