你认为这是一种最快的方法来获得低于指定数字的素数在一个衬里:
[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))]
你认为这是一种最快的方法来获得低于指定数字的素数在一个衬里:
[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))]
我认为这些行很便宜,并且您应该在必要时在多行上编写可读代码。
在这种情况下,这是必要的。此外,如果您需要将其用于 Project Euler 问题以外的任何问题,则应使用图书馆中的 Prime sieve。
您将紧凑代码与高效代码混淆了。上面的代码有一些提高效率的方法,但不管是一行还是十行都没有关系。Python在执行之前将人类可读的代码编译为字节码。您无法控制将代码转换为多少字节码指令。
确实,列表推导通常比for
循环更快,但并非普遍正确。使用隐含循环(例如map()
通常更快)通常也是如此。timeit
和dis
模块是你的朋友。这样,您就可以自己找出某段代码是否比另一段更快。
过早的优化是愚蠢的。在开始修补之前确定代码中的瓶颈。你能确定上面代码的哪一部分最有可能减慢它的速度吗?
是的,是的,你不应该在一行中这样做。出于原因。但我喜欢一个很好的挑战。
这是我想出的单班轮,“相当”快。这是一个非常复杂的混乱,但它有效。它可以“更短”,但我发现“if step%3 or step==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)} )
想知道同样的......为什么不只是:
[2] + [x for x in xrange(3,max,2) if not [y for y in xrange(3,int(x**0.5)+1,2) if x%y==0]]