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张贴再次我会检讨这一点!