Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.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 改进这个素数列表实现_Python_Math - Fatal编程技术网

Python 改进这个素数列表实现

Python 改进这个素数列表实现,python,math,Python,Math,下面的代码列出了所有素数 这是埃拉托斯坦筛的新实现吗 如何改进代码,使其在达到更高的数字时运行得更快 def PrimeSieve(curNum): prime = True del updateList[:] for cp in PrimeList: daPrime, daSkip = cp if curNum == daSkip: prime = False upcp = (daPrime

下面的代码列出了所有素数

这是埃拉托斯坦筛的新实现吗

如何改进代码,使其在达到更高的数字时运行得更快

def PrimeSieve(curNum):
    prime = True
    del updateList[:]
    for cp in PrimeList:
        daPrime, daSkip = cp
        if curNum == daSkip:
            prime = False
            upcp = (daPrime, daSkip + daPrime)
            updateList.append(upcp)
        else:
            updateList.append(cp)
    if prime:
        updateList.append((curNum,2*curNum))
    return prime

PrimeList = []
updateList = []

for x in range(2, 1111):
    print(x, PrimeSieve(x))
    del PrimeList[:]
    for i in updateList:
        PrimeList.append(i)

可能有很多方法可以改进这一点,但最让我印象深刻的是——为什么要有updateList和PrimeList,每次迭代都要不断地删除和复制它们。随着列表变长,这需要更多的时间。摆脱其中一个是我的第一个改变

def PrimeSieve(curNum):
    prime = True
    addSet = set()
    delSet = set()
    for cp in PrimeSet:
        daPrime, daSkip = cp
        if curNum == daSkip:
            prime = False
            addSet.add((daPrime, daSkip + daPrime))
            delSet.add(cp)
    if prime:
        addSet.add((curNum, 2 * curNum))
    PrimeSet.difference_update(delSet)
    PrimeSet.update(addSet)
    return prime


PrimeSet = set()

for x in range(2, 11111):
    print(x, PrimeSieve(x))

(编辑:将列表替换为有效替换集)

也许这应该发布到Good idea-易于阅读的代码中。但是这个列表会随着无关的项目而增长。您不希望在某个时刻删除cp而添加PrimeList.append(upcp)。您始终只能跟踪每次迭代中要添加和删除的元素,并在从函数返回之前更新PrimeList。按值删除对象在集合上比在列表上效果更好,因为您不需要列表按任何特定顺序排列。我保留了原始格式,但您应该遵循python标准。python中的变量名不使用CamelCase。除了类名(prime_-sieve、da_-prime、cur_-num)和更有意义的名称(我不知道daPrime和daSkip是什么意思)之外,您应该使用snake_大小写。在这里阅读更多关于python编码标准(称为PEP8)的信息:非常感谢!我想成为python的专业玩家,但现在我是一个爱好者,所以不太担心名字。但b4张贴再次我会检讨这一点!