有什么方法可以使此代码更高效?

时间:2020-05-07 11:29:28

标签: python-3.x performance numpy

我必须编写代码来计算在任意2个给定数字(A [0],A [1])(包括两者)之间具有最大除数的元素数量。我必须采用以空格分隔的线的形式输入。输入的第一行给出了示例中存在的案例数。这段代码可以正常工作,但是需要一些时间来执行。谁能帮我更有效地编写此代码?

import numpy as np
from sys import stdin
t=input()
for i in range(int(t)):
    if int(t)<=100 and int(t)>=1:
        divisor=[]
        A=list(map(int,stdin.readline().split(' ')))
        def divisors(n):
            count=0   
            for k in range(1,int(n/2)+1):
                if n%k==0:
                    count+=1
            return count
        for j in np.arange(A[0],A[1]+1):
            divisor.append(divisors(j))
        print(divisor.count(max(divisor)))

样本输入:

2
2 9
1 10

样本输出:

3
4

1 个答案:

答案 0 :(得分:0)

有一种方法可以根据数字的质因数来计算除数。 考虑到素数分解,计算除数的速度比尝试除法的速度快(您可以在此处进行此操作)。

但是素数分解必须快速。对于具有预先计算的质数列表(易于执行)的小数,可以快速进行质因数分解,并且也可以快速进行除数计算。如果您知道要测试的数字的上限(我们称其为L),则需要不超过sqrt(L)的质数。给定数字n = p_1^e_1 * p_2^e_2 * .. * p_k^e_knumber of divisors is simply (1+e_1) * (1+e_2) * .. * (1+e_k)

的素数分解

甚至更多,您可以预先计算和/或记住一些过度使用的数字的除数的数量,直到一定数量。这样可以节省大量时间,但会增加内存,否则您可以直接进行计算(例如,使用以前的方法)。

除此之外,您可以对代码进行一些优化。例如,您可以避免一直进行int(t)强制转换(和类似操作),只执行一次并将其存储在变量中。

Numpy可以一起避免,它是多余的,我怀疑会增加速度优势,取决于。

这应该使您的代码更快,但始终需要通过实际测试来衡量性能。

相关问题