【发布时间】:2019-07-12 22:59:51
【问题描述】:
下面显示的 Eratosthenes 筛子的实现非常低效。我对找到最有效的方法不感兴趣;我只是想让我已经做得更好。
我知道有很多不同的方法可以做到这一点;我刚刚实现了我头顶上的筛子,我的问题是我想知道我可以做些什么来使这个特定实现的一个特定部分更有效率。
def sieve(x):
l = []
for i in range(x + 1):
l.append(i)
l.remove(0)
l.remove(1)
clone = l[:]
test = 0
for i in l:
while test < len(clone):
checker = clone[test]
if checker % i == 0 and i != checker and i < checker:
clone.remove(checker)
test += 1
test = 0
return clone
print(sieve(24))
如果您将上述代码粘贴到http://pythontutor.com/visualize.html#mode=edit 并逐步执行,您会注意到在第 200 步之前已完成查找所有素数;它主要是浪费时间遍历外部for 循环的长度。那么操作问题是:在这个特定的实现中,我如何减少它在for 循环中花费的时间?为了提高效率,我所做的最多就是替换四个clone[test] 的实例,对 checker 进行了一次分配(好吧,无论如何,每个循环都有一次分配)。
【问题讨论】:
-
如果代码有效并且您只需要改进建议,则应改为在 Code Review 上。但请注意,他们会要求您提供
main以显示其运行方式。 -
我可以要求搬家吗?我需要标记它吗?如果我这样做,我会失去我刚刚在这里获得的代表吗?
-
我投票结束这个问题,因为它属于codereview.stackexchange.com
标签: python performance for-loop sieve-of-eratosthenes