【问题标题】:A faster solution for Project Euler question 10Project Euler 问题 10 的更快解决方案
【发布时间】:2022-11-29 04:46:09
【问题描述】:

我已经解决了关于 200 万以下所有素数之和的问题 10,但是我的代码需要几分钟才能计算出结果。

我只是想知道是否有任何方法可以优化它以使其运行得更快?

  • 代码取上限
  • 生成数组
  • 遍历它并删除数字的倍数,将其替换为 0
  • 获取过滤后的数组并循环遍历下一个非零数字
  • 增加这个数字直到它是限制的平方根。
  • 打印出剩余的内容。
import numpy as np


def sievePrime(n):
    array = np.arange(2, n)

    tempSieve = [2]

    for value in range(2, int(np.floor(np.sqrt(n)))):
        if tempSieve[value - 2] != value:
            continue
        else:
            for x in range(len(array)):
                if array[x] % value == 0 and array[x] != value:
                    array[x] = 0
                    tempSieve = array

    return sum(array)


print(sievePrime(2000000))

感谢您的时间。

【问题讨论】:

  • 用 C/C++ 写这个怎么样? Python 对于这些任务来说真的很慢。
  • 1.偶数不用查,都是合数(2除外)。 2. 对于一个给定的数字,你不需要检查它是否可以被所有不超过 2mil 的数字整除,只需要被小于给定数字的素数整除
  • 一旦您确定了一个新素数 p 并希望将它的倍数设置为 0,请使用步长为 p 的 for 循环。您的代码正在做的是测试全部p 以上的数字,看看它们是否是倍数。那是非常低效的。
  • 问题 - 你能做第 3 方库吗快速素数?似乎没问题 - 因为你在这里使用 np 。

标签: python python-3.x


【解决方案1】:

感谢您的输入。我能够通过更改检查素数的方式来改进代码。

代码在 2 秒而不是几分钟内完成。

数组不是从头到尾计数,而是从素数到数组末尾,素数递增。

再次感谢您的建议。

import numpy as np
import time

start_time = time.time()


def sievePrime(n):
    array = np.arange(2, n)

    tempsieve = [2]

    for value in range(2, int(np.floor(np.sqrt(n)))):
        if tempsieve[value - 2] != value:
            continue
        else:
            for x in range(value, len(range(n)), value):
                if array[x - 2] % value == 0 and array[x - 2] != value:
                    array[x - 2] = 0
                    tempsieve = array
                else:
                    continue

    return sum(array)


print(sievePrime(2000000))
print("--- %s seconds ---" % (time.time() - start_time))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2016-04-30
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多