python素数在一个班轮

时间:2012-07-25 02:44:20

标签: python

您是否认为这是在一个班轮中使素数低于指定数字的最快方式:

[p for p in xrange(3,1000000) if p%2 != 0 and 0 not in (p%d for d in xrange(3,int(p**0.5)+1))]

3 个答案:

答案 0 :(得分:4)

我认为这些行很便宜,你应该在必要时在多行上编写可读代码。

在这种情况下,这是必要的。此外,如果您需要将此项用于Project Euler问题以外的任何其他问题,则应使用库中的Prime筛。

答案 1 :(得分:1)

您将紧凑的代码与高效代码混淆。有 方法来提高上述代码的效率,但如果你在一行或十行中进行操作则无关紧要。 Python在执行之前将人类可读代码编译为字节码。您无法控制代码转换为多少字节码指令。

确实,列表推导通常比for循环更快但不是普遍正确。通常情况下,使用隐含循环(例如map())通常更快。 timeitdis模块是您的朋友。这样,您就可以自己找出某段代码是否比另一段快。

过早优化是愚蠢的。在开始修补之前,确定代码中的瓶颈。你能否确定上述代码的哪一部分可能会减慢它的速度?

答案 2 :(得分:0)

是的,是的,你不应该在一行中做到这一点。出于原因。但我喜欢一个很好的挑战。

这就是我提出的一个班轮,这是合理的'快速。它是一个奇妙的混乱,但它的工作原理。它可以更短'但是我发现如果步骤%3或步骤== 3'实际上通过消除三分之一的工作来加快速度。并使用集合理解..如果您不关心列表是否已排序,您可以通过删除sorted()调用来削减一些。

[2] + sorted(set(xrange(3,max,2)) - { x for step in xrange(3, int(max**0.5) + 1, 2) if step %3 or step==3 for x in xrange(step * 3, max, step * 2)} )