Python 对于大值(高达1亿),如何使代码运行得更快?

Python 对于大值(高达1亿),如何使代码运行得更快?,python,python-3.x,algorithm,number-theory,Python,Python 3.x,Algorithm,Number Theory,好的,背景:我正在解决一个问题,需要我找到一个数字‘n’,这样n-9,n-3,n+3,n+9是连续的素数,n-8,n-4,n+4,n+8是实际数,然后我必须加上满足这个条件的前四个n 问题是:代码的逻辑是正确的还是不正确的在这里无关紧要,因为我的代码在达到1亿之前就崩溃了。我甚至不能检查代码的输出,它可以正常工作100万,但不能扩展到更大的数字 我所做的: 我用了埃拉的筛子。。。为了使素数达到1亿,我们称之为M。由于实际数可以被6或4整除,我创建了另一个集合来存储这些数,然后从这个列表中创建了一

好的,背景:我正在解决一个问题,需要我找到一个数字‘n’,这样n-9,n-3,n+3,n+9是连续的素数,n-8,n-4,n+4,n+8是实际数,然后我必须加上满足这个条件的前四个n

问题是:代码的逻辑是正确的还是不正确的在这里无关紧要,因为我的代码在达到1亿之前就崩溃了。我甚至不能检查代码的输出,它可以正常工作100万,但不能扩展到更大的数字

我所做的: 我用了埃拉的筛子。。。为了使素数达到1亿,我们称之为M。由于实际数可以被6或4整除,我创建了另一个集合来存储这些数,然后从这个列表中创建了一个集合,其中包含满足这个条件的数:'n-8,n-4,n+4,n+8是实数,我们称之为n。最后,我遍历n中的每个元素a,并检查a-9、a-3、a+3、a+9是否是素数集的一部分

如果有人对我如何加速或任何更好的算法有任何建议,我将不胜感激

代码

def筛下费拉托斯烯(n):
m=集合()
prime=[范围(n+1)内的i为真]
p=2

(p*p首先,
ps1
是错误的。测试应该说
,而不是

接下来,如果
n
可被4整除,则所有
n-8、n-4、n+4、n+8
也可被4整除。如果
n
不可被4整除,则它们中没有一个可被4整除,其中一些也不可被4整除。这意味着您只对
n
是4的倍数感兴趣


最后,我知道这个问题意味着一些严肃的数字理论作业。蛮力不会这么做。

你的问题是它“在达到1亿之前崩溃”还是太慢?@miquelvir两者都是,1亿对我来说需要很长时间,然后过了一段时间,突然我可以听到我的笔记本电脑加速了,我的整个系统都在加速屏幕停止冻结然后崩溃。只有当我运行此代码时才会发生这种情况,花费100万就可以了。你可以使用多处理;如果你能够将问题分成不同的部分,每个处理器都可以计算其中的一部分。读。@miquelvir我考虑过这一点,但问题可以在1分钟左右解决,而不需要多处理。所以我希望代码优化不要存储所有的数字,只需动态生成素数并保留所需的(最多N-18和N之间的素数)。检查素数的条件,如果满足,则检查实际数字的条件。我们有很好的答案来构建N可被5、6或7整除的无限素数生成器?
def SieveOfEratosthenes(n):
    m = set()
    prime = [True for i in range(n + 1)]
    p = 2
    while (p * p <= n):
        if (prime[p] == True):
            for i in range(p * 2, n + 1, p):
                prime[i] = False
        p += 1
    prime[0]= False
    prime[1]= False
    for p in range(n + 1):
        if prime[p]:
            m.add(p)
    return m

#creates set that stores multiples of 4 and 6

def ps1(n):
    s = set()
    for i in range(1, n+1):
        if i%4 == 0 and i%6 == 0:
            s.add(i)
    return s

#checks whether any number satisfies n -8, n-4, n+4, n+8 must be practical and stores it in a set

def ps2(l):
    q = set()
    for i in l:
        if ((i-8) in l) and ((i-4) in l) and ((i+4) in l) and ((i+8) in l):
            q.add(i)
    return q

#using the numbers stored in the prev set, i check the last condition n-9, n-3, n+3, n+9 must be in the 
prime list
def TotalSieve(k, l):
    q = set()
    inc = 0
    for i in k:
        if inc != 4:
            if ((i-9) in l) and ((i-3) in l) and ((i+3) in l) and ((i+9) in l):
                inc = inc + 1
                q.add(i)
        else:
            print("Found 4")
    return q
                                                                       
# driver program
if __name__=='__main__':
    n = 1000000000
    m = SieveOfEratosthenes(n)
    p = ps1(n)
    p = ps2(p)
    f = TotalSieve(p, m)
    elem1 = f.pop()
    elem2 = f.pop()
    elem3 = f.pop()
    elem4 = f.pop()
#add the first four numbers that satisfy the conditions
    tot = elem1 + elem2 + elem3 + elem4
    print(tot)