当我尝试记忆时,为什么我的代码会变慢?

时间:2017-02-22 19:23:27

标签: python primes memoization

我有一个列出小于N的素数的函数:

def ListPrimes(N):
    list = [2]
    for n in range(3, N, 2):
        for i in range(3, int(sqrt(n)+1)):
            if n % i == 0:
                break
        else:
            list.append(n)
    return list

我试图让它更快,所以我将一行改为:

def ListPrimesFaster(N):
   list = [2]
   for n in range(3, N, 2):
        for i in list:
            if n % i == 0:
                break
        else:
            list.append(n)
    return list

我很惊讶第二个版本至少慢了5倍,因为它与第一个版本相同,只是变量i必须遍历较短的列表。

我试图找到一种更快的方法来列出小于某些N的素数。

1 个答案:

答案 0 :(得分:1)

ListPrimesFaster()不会搜索较短的列表,因为它包含list中高于sqrt(n)的元素。 list的大小增长速度快于sqrt(n),并且从3开始范围也可以节省几个步骤。 ListPrimes(100)执行139 n % i == 0次测试,而ListPrimesFaster(100)执行362。当N500时,测试计数为16164933

BTW,在ListPrimes()中,内部循环只需要测试奇数因子,因为n总是奇数,所以你可以把它改成:

for i in range(3, int(sqrt(n)+1), 2):

这个简单的更改会将87的{​​{1}}和N = 100的{​​{1}}的测试次数减少。