Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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 素数生成器优化(Euler 7项目)_Python_Optimization - Fatal编程技术网

Python 素数生成器优化(Euler 7项目)

Python 素数生成器优化(Euler 7项目),python,optimization,Python,Optimization,我想优化此代码,以便缩短完成此任务的时间我确实想一直打印所有素数: 获得第10001个素数 计数器=10001 target_num=1,因为如果我们第一次向它添加1,它将变成2 输入'这可能需要一段时间,按回车键继续;您可以随时按CTRL+C停止程序 而计数器0: 目标数量=目标数量+1 对于范围1中的x,目标数量+1: 如果目标数量%x==0: 如果x==1: 通过 以利夫x!=目标数量: 打破 elif x==目标数量: 计数器=计数器-1 print target_num打印素数,以便用

我想优化此代码,以便缩短完成此任务的时间我确实想一直打印所有素数:

获得第10001个素数

计数器=10001 target_num=1,因为如果我们第一次向它添加1,它将变成2 输入'这可能需要一段时间,按回车键继续;您可以随时按CTRL+C停止程序 而计数器0: 目标数量=目标数量+1 对于范围1中的x,目标数量+1: 如果目标数量%x==0: 如果x==1: 通过 以利夫x!=目标数量: 打破 elif x==目标数量: 计数器=计数器-1 print target_num打印素数,以便用户知道程序是否在处理数字 打印“10001素数为:”+strtarget\u num
我给你的密码计时。这就是所需的时间:

Over 72 seconds (%timeit died, sorry!)
最突出的问题是,您运行从1到target_num的循环来查找素数。那没必要

可以看到这方面的证据

这是一个运行到平方根的版本。你也可以删除那些多余的ifs

进一步的加速可以通过将范围增加2来实现,因此您可以跳过偶数的检查:

def foo():
    counter = 10000
    target_num = 1          
    while counter <= 10001 and counter > 0:
        target_num = target_num + 2
        ...

脚注:这个答案解释了你目前方法的不足之处。但是,要获得一种全新的方法,请查看或@AChampion的答案。

我为您的代码计时。这就是所需的时间:

Over 72 seconds (%timeit died, sorry!)
最突出的问题是,您运行从1到target_num的循环来查找素数。那没必要

可以看到这方面的证据

这是一个运行到平方根的版本。你也可以删除那些多余的ifs

进一步的加速可以通过将范围增加2来实现,因此您可以跳过偶数的检查:

def foo():
    counter = 10000
    target_num = 1          
    while counter <= 10001 and counter > 0:
        target_num = target_num + 2
        ...

脚注:这个答案解释了你目前方法的不足之处。然而,要获得一种全新的方法,请查看或@AChampion的答案。

有许多资源可用于快速素数生成器。 例如,您可以安装primesieve,它提供:

In []:
import primesieve
primesieve.nth_prime(10001)

Out[]:
104743

In []:
%timeit primesieve.nth_prime(10001)

Out[]:
28.3 µs ± 549 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
简单筛选的本机python实现:

In []:
import itertools as it

def primes():
    yield 2
    sieve = {}
    for n in it.count(3, 2):
        if n not in sieve:
            sieve[n*n] = 2*n
            yield n
            continue
        a = sieve.pop(n)
        x = n + a
        while x in sieve:
            x += a
        sieve[x] = a

def nth_prime(n):
    return next(it.islice(primes(), n-1, None))

nth_prime(10001)

Out[]:
104743

In []:
%timeit nth_prime(10001)

Out[]:
26.3 ms ± 629 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

快速素数生成器有很多资源。 例如,您可以安装primesieve,它提供:

In []:
import primesieve
primesieve.nth_prime(10001)

Out[]:
104743

In []:
%timeit primesieve.nth_prime(10001)

Out[]:
28.3 µs ± 549 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
简单筛选的本机python实现:

In []:
import itertools as it

def primes():
    yield 2
    sieve = {}
    for n in it.count(3, 2):
        if n not in sieve:
            sieve[n*n] = 2*n
            yield n
            continue
        a = sieve.pop(n)
        x = n + a
        while x in sieve:
            x += a
        sieve[x] = a

def nth_prime(n):
    return next(it.islice(primes(), n-1, None))

nth_prime(10001)

Out[]:
104743

In []:
%timeit nth_prime(10001)

Out[]:
26.3 ms ± 629 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

您使用的是哪一版本的python?查看Eratosthenes的筛子以更快地计算素数。你的算法目前效率极低。节省时间的一个快速方法是跳过检查任何偶数,因为我们知道它们都是非素数的2。这里代码的速度慢主要是由于糟糕的算法,而不是我怀疑的糟糕的Python*sqrtx@minitotentPython3,我的代码非常低效,正如其他人已经提到的那样。@cᴏʟᴅsᴘᴇᴇᴅ 这是一个极好的回答,谢谢!您使用的是哪一版本的python?查看Eratosthenes的筛子以更快地计算素数。你的算法目前效率极低。节省时间的一个快速方法是跳过检查任何偶数,因为我们知道它们都是非素数的2。这里代码的速度慢主要是由于糟糕的算法,而不是我怀疑的糟糕的Python*sqrtx@minitotentPython3,我的代码非常低效,正如其他人已经提到的那样。@cᴏʟᴅsᴘᴇᴇᴅ 这是一个极好的回答,谢谢!