您是否认为这是在一个班轮中使素数低于指定数字的最快方式:
[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))]
答案 0 :(得分:4)
我认为这些行很便宜,你应该在必要时在多行上编写可读代码。
在这种情况下,这是必要的。此外,如果您需要将此项用于Project Euler问题以外的任何其他问题,则应使用库中的Prime筛。
答案 1 :(得分:1)
您将紧凑的代码与高效代码混淆。有 方法来提高上述代码的效率,但如果你在一行或十行中进行操作则无关紧要。 Python在执行之前将人类可读代码编译为字节码。您无法控制代码转换为多少字节码指令。
确实,列表推导通常比for
循环更快但不是普遍正确。通常情况下,使用隐含循环(例如map()
)通常更快。 timeit
和dis
模块是您的朋友。这样,您就可以自己找出某段代码是否比另一段快。
过早优化是愚蠢的。在开始修补之前,确定代码中的瓶颈。你能否确定上述代码的哪一部分可能会减慢它的速度?
答案 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)} )