python - 谁能教我如何进一步优化这个 'print up to the nth prime number' 脚本?

标签 python algorithm optimization performance numbers

<分区>

我今年 17 岁,开始借助 Python 编程语言进行编程。

我一直在寻求优化此算法,可能是通过消除其中一个循环,或者使用更好的测试来检查素数。

尝试计算和显示 100000 个质数时,脚本会暂停大约 6 秒,因为它会在质数列表作为输出返回到控制台之前用质数填充列表。

我一直在尝试使用

print odd,

简单地打印每个找到的质数,这对于 n = 1000 这样的较小输入更快,但是对于 n = 1000000,列表本身的打印速度要快得多(在 python shell 和控制台中)。

也许应该修改整个代码/算法,但脚本应该保持基本相同:用户键入要打印的素数 (n) 并且脚本返回所有素数,直到第 n 个素数.

from time import time
odd = 1
primes = [2]
n = input("Number of prime numbers to print: ")
clock = time()
def isPrime(number):
    global primes
    for i in primes:
        if i*i > number:
            return True
        if number%i is 0:
            return False
while len(primes) < n:
    odd += 2
    if isPrime(odd):
        primes += [odd]
print primes
clock -= time()
print "\n", -clock
raw_input()

我可能想重写整个脚本以使用像阿特金筛法这样的筛子:http://en.wikipedia.org/wiki/Sieve_of_Atkin

但是,我只是 Python 的初学者(甚至是编程方面的初学者:我两周前才开始编写代码),弄清楚如何用 Python 编写阿特金筛算法对我来说是一个相当大的挑战。

我希望那里的谷歌黑客能帮助我完成这样的事情:(

最佳答案

你可以使用 prime sieve ,并进行简单的改动:

  1. 像你一样定义第一个素数2,将达到的最大数(max)设置为2;
  2. 生成从max+1max+nn个连续数的列表;
  3. 对列表中的素数进行筛选。筛选时,将每个素数的起始数设置为列表中可以被素数整除的最小数;
  4. 如果金额未达到,则转到2。

这样就可以控制列表的长度,长度越大,速度越快。然而,这是对算法的彻底改造,并且更难编程。

下面是一个示例代码,比较粗糙,但只用了不到原始代码 70% 的时间:

from math import sqrt
from time import time
primes = [2]
max = 3
n = input("Number of prime numbers to print: ")
r=2
clock = time()
def sieve(r):
    global primes
    global max
    s = set(range(max,max+r))
    for i in primes:
        b=max//i
        if (b*i<max):
            b=b+1
        b=b*i
        while b<=max+r-1:
            if b in s:
                s.remove(b)
            b=b+i
    for i in s:
        primes.append(i)
while len(primes) < n:
    r=primes[-1]
    sieve(r)
    max=max+r
primes=primes[0:n]
print primes
clock -= time()
print "\n", -clock
raw_input()

有很多方法可以改进这一点,这只是展示了方法的概念。

此外,当数字很大时,这可能会耗尽内存。我使用动态限制尝试在一定程度上缓解这种情况。

如果你真的很好奇(并且无所畏惧),你可以看看各种开源项目中更复杂的实现。一个例子是 Pari/GP,它是用 C++ 编写的,速度非常快(如果我没记错的话,我在不到 1 分钟的时间内测试了 1 到 50000000)。将它们翻译成 Python 可能很难,但会有所帮助,也许不仅仅是为了你自己;-)

关于python - 谁能教我如何进一步优化这个 'print up to the nth prime number' 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921348/

相关文章:

python - 如何将一个类的功能分离到多个文件中?

python - Wand python 使用 GIF 获取像素颜色

python - Tensorflow a2.0.0 : Converting CSV to a tfrecord, 创建一个 Keras 模型,该模型使用来自大型源的管道数据,将权重存储到 CSV 文件中?

algorithm - 文本中最长的字符串

algorithm - OCR:根据最后 N 个结果选择最佳字符串(OCR 自适应过滤器)

ruby - 解释简洁的 ruby​​ 'nil' 错误

java - java中timer实例可以重用吗?

python - 从 pandas 数据框中选择不连续和连续的列

c++ - 将基本数据类型封装到类中

Python 读取大型文本文件(几 GB)的最快方法