Python 优化有助于找到最大除数

Python 优化有助于找到最大除数,python,Python,我正在尝试解决Euler项目的问题12。第一个有500个以上除数的三角形数的值是多少?(第七个三角形的数字是1+2+3+4+5+6+7=28)。这是我的代码,但速度不够快。。 你有什么优化建议吗 n=0 a=0 list=[] maxcount=0 while True: n+=1 a+=n count=0 for x in range(1,int(a+1)): if a%x==0: count+=1

我正在尝试解决Euler项目的问题12。第一个有500个以上除数的三角形数的值是多少?(第七个三角形的数字是1+2+3+4+5+6+7=28)。这是我的代码,但速度不够快。。 你有什么优化建议吗

n=0
a=0
list=[]
maxcount=0


while True:
    n+=1
    a+=n
    count=0
    for x in range(1,int(a+1)):
        if a%x==0:
            count+=1   
            if count>maxcount:
                maxcount=count
                print a, "has", maxcount, "dividors"

谢谢大家!

除了数论之外:尝试缓存,然后反过来做。例如:当您已经知道300有18个除数(以及它们是什么)时,对于一个可以被300除数的数字来说,这意味着什么?你能缓存这些信息吗?(当然可以。)


纯python加速黑客帮不了你,你需要一个更好的算法。

从这个问题中获取实现快速素数分解的代码:

然后使用此问题的答案将素因子转换为所有除数的列表(长度是您想要的):

例如,您可以将以下功能(从第二个链接改编)从第一个链接添加到模块底部:

def alldivisors(n):
    factors = list(factorization(n).items())
    nfactors = len(factors)
    f = [0] * nfactors
    while True:
        yield reduce(lambda x, y: x*y, [factors[x][0]**f[x] for x in range(nfactors)], 1)
        i = 0
        while True:
            if i >= nfactors:
                return
            f[i] += 1
            if f[i] <= factors[i][1]:
                break
            f[i] = 0
            i += 1
def所有除数(n):
因子=列表(因子分解(n).items())
nfactors=len(因子)
f=[0]*n因子
尽管如此:
产量减少(λx,y:x*y,[系数[x][0]**f[x]表示范围内的x(非因子)],1)
i=0
尽管如此:
如果i>=nfactors:
返回
f[i]+=1

如果f[i]从减少搜索空间开始,则无需查看不是三角形的数字。还可以尝试查看
范围(1,sqrt(n))中的除数
而不是
范围(1,n)

仅检查数字sqrt以下的除数。节省数百万张支票