Python 3.x 如何在python中更有效地迭代列表?

Python 3.x 如何在python中更有效地迭代列表?,python-3.x,Python 3.x,我试图创建一个程序,返回任何给定数字中最大的素数因子。代码适用于相对较小的数字,但一旦它们开始变大,代码将永远无法运行 备忘录={} def是_primen: 如果备忘录中没有n: 备注[n]=正确 对于范围2内的i,整数**0.5+1: 如果n%i==0: 备注[n]=错误 返回错误 返回备忘录[n] 定义基本因子n: 因子=[] 素数因子=[] 对于rangen的i,2,-1: 如果n%i==0: 阑尾因子 对于num in因子: 如果是_primenum: 素数 打破 打印素数 素数因子

我试图创建一个程序,返回任何给定数字中最大的素数因子。代码适用于相对较小的数字,但一旦它们开始变大,代码将永远无法运行

备忘录={} def是_primen: 如果备忘录中没有n: 备注[n]=正确 对于范围2内的i,整数**0.5+1: 如果n%i==0: 备注[n]=错误 返回错误 返回备忘录[n] 定义基本因子n: 因子=[] 素数因子=[] 对于rangen的i,2,-1: 如果n%i==0: 阑尾因子 对于num in因子: 如果是_primenum: 素数 打破 打印素数 素数因子
不管怎样,有没有办法提高效率,我认为这与我指的是质数因子函数中的另一个函数有关,这导致它效率非常低

不幸的是,我不太理解您的方法,尤其是为什么您总是从一开始就开始在is_primen函数中计算,这大大增加了大型输入的复杂性。另外,对于prime\u factorsn函数中的for num in factors:part对我来说没有多大意义

但是,您可以尝试此解决方案:

import time


def get_next_prime(n: int = 0):
    if n < 1:
        return 2

    if 1 <= n < 3:
        return n + 1

    while True:
        n += 1

        # Corner cases
        if n % 2 == 0 or n % 3 == 0:
            continue

        i = 5
        not_prime = False
        # check till sqrt(n) because a larger factor of n must be
        # a multiple of smaller factor that has been already checked.
        while i * i <= n:
            if n % i == 0 or n % (i + 2) == 0:
                not_prime = True
                break

            i = i + 6

        if not_prime:
            continue

        return n


def prime_factors(dividend):
    # dividend : divisor = quotient (remainder)
    divisor = get_next_prime()
    quotient = -1

    factors = []

    while quotient != 0:
        remainder = dividend % divisor
        quotient = dividend // divisor

        if remainder == 0:
            factors.append(divisor)
            dividend = quotient
        else:
            divisor = get_next_prime(divisor)

    return factors

start = time.time()
print(prime_factors(899999999998))
end = time.time()
print(end - start)
查看此演示:

关于适当的算法,考虑这个例子:

术语: 除数:除数=商余数

i、 e.7:2=3.1

问题:找出18的主要因素

最初的 获取除数的下一个素数:即2 18 : 2 = 9 0 余数0 取2并更新红利 9 : 2 = 4 1 余数不是0 得到除数的下一个素数:3;股息保持不变 9 : 3 = 3 0 余数0 取3并更新红利 3 : 3 = 1 0 余数0 取3并更新红利 1 : 3 = 0 0 商为0->停止! 主要因素:{2,3,3}

您可以查看。
在内置映射中,引用其他函数的过滤函数

并不是效率低下的原因yyep。他还将整数的每一位都记录在备忘录字典中,以跟踪素数——这是不必要的。你需要一个更好的算法来加快运算速度。是的,代码中的列表方法较慢,因为为列表生成了不必要的数字。如果您反复运行此操作,您可以首先创建一个素数列表,其最大值为输入数的平方根。当输入数非常大时,可以查看Miller-Rabin素数分解的极快方法。