61
|
Srikar Appalaraju Tonetel · 技术社区 · 14 年前 |
1
106
您没有完全实现正确的算法:
在第二个例子中,
正确的算法(使用列表而不是字典)类似于:
(请注意,这还包括在素数的平方开始非素数标记的算法优化(
|
2
11
|
3
7
要从数组(列表)的开头删除,需要向下移动该数组之后的所有项。这意味着以这种方式从前面开始删除列表中的每个元素是一个O(n^2)操作。 使用集合可以更有效地执行此操作:
... 或者,避免重新排列列表:
|
4
4
|
5
2
我意识到这并不能真正回答如何快速生成素数的问题,但也许有些人会发现这个替代方法很有意思:因为python通过生成器提供了惰性的计算,所以可以按照下面的说明来实现eratosthenes的sieve:
try块在那里是因为算法一直运行到它吹出堆栈,而没有 try block将在屏幕外显示backtrace并推送您要查看的实际输出。 |
6
2
在我的机器上计算10次方不同输入所用的时间是:
|
7
1
一个简单的速度技巧:当你定义变量“primes”时,将步骤设置为2以自动跳过所有偶数,并将起点设置为1。 然后,可以进一步优化by,而不是for i in primes,使用for i in primes[:round(len(primes)**0.5]。这将大大提高性能。此外,您可以消除以5结尾的数字,以进一步提高速度。 |
8
1
我的实现:
|
9
1
你会注意到的
如果你想知道的话,我也写了
|
10
1
我喜欢裸体是因为速度。
检查输出:
|
11
1
我想应该可以简单地使用空列表作为循环的终止条件,并得出以下结论:
|
12
1
|
13
1
|
14
1
使用一点
有两个关键特性值得注意
这两个明显加快了代码的速度。对于100万以下的限制,没有可感知的运行时间。
|
15
1
我能想到的最快的实现:
|
KOB · 访问变量索引处的数组 8 年前 |