一行中的python素数

一行中的python素数,python,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))] 我认为行是便宜的,并且您应该在必要时在多行上编写可读代码 在这种情况下,这是必要的。此外,如果您需要将其用于Project Euler问题以外的任何问题,则应使用库中的素筛。您将紧凑代码与高效代码混淆了。有很多方法可以提高上述代码的效率,但不管是一行还是十

你认为这是在一行中得到低于指定数的质数的最快方法吗

[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问题以外的任何问题,则应使用库中的素筛。

您将紧凑代码与高效代码混淆了。有很多方法可以提高上述代码的效率,但不管是一行还是十行。Python在执行之前将人类可读的代码编译成字节码。您无法控制代码转换为多少字节码指令

的确,列表理解通常比循环快,但并非普遍如此。通常情况下,使用诸如map之类的隐含循环通常会更快。timeit和dis模块是您的朋友。这样,您就可以自己发现某段代码是否比另一段代码快


过早优化是愚蠢的。在开始修补之前,先确定代码中的瓶颈。你能确定上面的代码中哪一部分可能是最慢的吗?

是的,你不应该在一行中完成这项工作。出于种种原因。但我喜欢好的挑战

以下是我提出的一行程序,即“合理”快速。这是一个非常复杂的混乱,但它是有效的。它可以“更短”,但我发现“如果步骤%3或步骤==3”实际上通过消除三分之一的工作量加快了速度。。以及使用集合理解。。如果您不关心列表是否已排序,可以通过删除已排序的调用来删除一些

[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]]

这只是一个试验性的划分,而且在这一点上是一个非常低效的实现。该算法速度更快,但也更难实现,尤其是在一行中。还值得注意的是,前缀为Do you think的问题通常不适用于StackOverflow。在列表理解中编写内容并不能提高算法的效率。你问的问题很傻,答案只有一个词。令人惊讶的是,在pypy上快10倍:>>>>timeit'[2]+[x代表x在xrange3中,最大值,2如果不是[y代表y在xrange3中,intx**0.5+1,2如果x%y==0]','max=1000000',数字=1.110201120376587