【问题标题】:Faster Calculations Using Numpy使用 Numpy 进行更快的计算
【发布时间】:2019-08-26 02:45:29
【问题描述】:

我有这个程序可以列出一定范围内的素数。问题是数字越大,它变得越慢。我如何使用 numpy 来提高速度?如果不是 numpy,有没有其他方法可以加快计算速度?

from datetime import date
import time
import numpy as np

today = date.today()

lower = int(input("Starting Number: "))
upper = int(input("Ending Number: "))

print("Prime numbers between",lower,"and",upper,"are:")
with open("primenumbers.txt","a") as file:
    file.write("\n")
    file.write("{}".format(today))
    file.write("\n")

start = time.time()

for num in range(lower,upper + 1):
   if num > 1:
       for i in range(2,num):
           if (num % i) == 0:
               break
       else:
         print(num)
         with open("primenumbers.txt","a") as file:
             file.write("\n")
             file.write("{}".format(num))
end = time.time()
print(end - start)

我想更快地处理数据,请显示一些代码。

【问题讨论】:

  • 数字越大越慢”:是的,素数就是这样。您检查的最大数量越大,所需的时间就越长。你有什么问题?
  • @ifconfig 我明白这一点,但我怎样才能让这个过程更快。我看到人们使用 numpy 来加快方程的速度,所以我该怎么做。
  • for i in range(2,num): if (num % i) == 0... 哦,我的... 请先优化您要比较的值。如果数字是素数,那么它将是奇数并且应该有一个除数,这样divisor <= sqrt(num) 包括偶数会使您正在执行的迭代次数加倍,并且一直搜索到该数字会使迭代次数相对而言绝对巨大搜索到平方根。请阅读数论。理想情况下,您应该缓存在一个筛子中并使用它来优化您的搜索。
  • @SpencerD 对不起,我不明白你能不能简单解释一下。我对 python 很陌生,我不是成年人,所以我没有经验。
  • 搜索 '[numpy] prime' 得到了这个 stackoverflow.com/q/49936222 等等。但是为此使用 numpy 的好处尚不清楚。 Python 整数可以大于 numpy 的 int64。

标签: python python-3.x numpy


【解决方案1】:

筛法是寻找素数的有效方法之一。我的回答灵感来自this SO 中的答案。对于 100 万,我得到了一个时间

16 ms ± 3.68 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

Numpy 实现

def first_n_prime_numbres(n):    
    s = np.arange(3, n, 2)
    for m in range(3, int(n ** 0.5)+1, 2):         
        if s[(m-3)//2]: 
            s[(m*m-3)//2::m]=0
    return np.r_[2, s[s>0]]

first_n_prime_numbres(100)

【讨论】:

    【解决方案2】:

    你一遍又一遍地计算相同的数字:

    for num in range(lower,upper + 1):
       if num > 1:
           for i in range(2,num):
    

    相反,您可以保存结果并对照它们进行检查。结帐动态编程。

    【讨论】:

    • 这并没有解释 如何 来实施修复。因此,这不是答案,应该作为评论发布。
    • 那么有人知道答案吗?
    • nvm 我使用了一组并将素数放入其中,然后列出了它,这加快了结果但不是很多。虽然如果有人知道我如何让它变得动态,那么它知道那会很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2022-01-21
    相关资源
    最近更新 更多