【发布时间】:2015-05-09 21:29:48
【问题描述】:
for 循环遍历一个长列表。我试图加速修改列表的迭代(没有成功)。 代码:
from math import sqrt
def holeofStrainer():
isPrime = [False, False] + [True]*999999
for num in range(3, len(isPrime)):
if isPrime[num] == False:
continue
else:
for x in range(2, int(sqrt(num)) + 1):
if num % x == 0:
isPrime[num] = False
break
else:
isPrime[num] = True
for item in range (2, int(1000001/num) + 2):
ple = item * num
if ple < len(isPrime):
isPrime[ple] = False
return(isPrime)
print(holeofStrainer())
第 5 行的目标是省去不必要的计算。
在 第 14-17 行我做了 修改(按照 Eratosthenes 的筛子,我将素数的倍数的值更改为 False)通过这种方式避免通过第 5 行进行更多计算。
总结:
- 是否可以从循环本身修改循环迭代列表?
- 如果答案是肯定的,为什么我的代码不好?
【问题讨论】:
-
for item in range (2, int(1000001/num) + 2)在做什么以及您实际上想用您的代码做什么? -
@PadraicCunningham “埃拉托色尼筛法”是一种通过过滤掉特定范围内的所有非素数来查找素数的方法。
-
以后,使用 4 个空格的缩进,因为这真的很难读。
-
for num in isPrime:num现在是True或False,而不是索引位置。 -
@PadraicCunningham 问题是一团糟,这段代码没有做它应该做的事情 - 而 OP 不是试图让它工作而是试图让它更有效率:)
标签: python list loops iteration self-modifying