![]() |
1
34
您的版本有几个小的优化。通过颠倒“真”和“假”的角色,你可以改变”
不过,这对你的记忆力问题没有帮助。 进入C扩展的世界,我使用了 gmpy . (免责声明:我是维护者之一。)开发版本称为gmpy2,支持称为xmpz的可变整数。使用gmpy2和下面的代码,我有0.140秒的运行时间。100000000的运行时间为158秒。
推动优化并牺牲清晰度,我得到的运行时间为0.107和123秒,代码如下:
编辑:基于此练习,我修改了gmpy2以接受
编辑2:再试一次!我修改了gmpy2接受
编辑3:我已经更新了gmpy2,以正确支持xmpz的位级别的切片。性能没有变化,但API很好。我做了一些小调整,时间降到了37秒左右。(请参见gmpy2 2.0.0b1中的“修改”4。)
编辑4:我在gmpy2 2.0.0b1中做了一些更改,打破了前面的示例。gmpy2不再将true视为提供无限1位源的特殊值。-应改为使用1。
编辑5:我对gmpy2 2.0.0b2做了一些增强。现在您可以迭代设置或清除的所有位。运行时间提高了约30%。
|
![]() |
2
8
好的,这里有一个(接近完成的)全面的基准测试,我今晚已经做了,看看哪个代码运行得最快。希望有人会发现这个列表有用。我省略了在我的机器上完成任何超过30秒的事情。 我要感谢每一个输入的人。我从你的努力中获得了很多见解,我希望你也有。 我的机器:AMDZM-86,2.40GHz双核,4GB内存。这是一台HP TouchSmart TX2笔记本电脑。请注意,虽然我可能链接到了一个Pastebin, 我在自己的机器上对以下所有内容进行了基准测试。 一旦我能够构建GMPY2基准,我将添加它。 所有的基准测试都在python 2.6x86中进行。
|
![]() |
3
8
好吧,这是我的第二个答案,但速度是关键,我认为我必须提到 bitarray 模块-即使它 bitstring “克星:”它非常适合这种情况,因为它不仅是C扩展(而且比纯Python希望的速度更快),而且还支持切片分配。但它还不能用于Python3。 我甚至没有尝试优化这个,我只是重写了位串版本。在我的机器上,100万以下的素数我得到0.16秒。 10亿美元,运行良好,在2分31秒内完成。
|
![]() |
4
6
相关问题: Fastest way to list all primes below N in python .
嗨,我正在寻找一个用python编写的代码来生成
10 ^ 9
尽可能快,这是因为记忆问题很困难。到目前为止,我想出了这个方法来生成素数。
10 ^ 6
和;
10 ^ 7
(在我的旧机器上分别计时0171s和1764s),这似乎比
“我改进的切片版本”
可能是因为我用了
Xavier用的其中一个代码
只要稍加修改,你就可以在上面写一个稍微慢一点的代码版本,从一半大小的筛子开始。
更快、更内存的生成器将是:
或者再加一点代码:
附言:如果您对如何加速这段代码有任何建议,从更改操作顺序到预计算,请发表评论。 |
![]() |
5
4
这是我之前写的一个版本;在速度方面与您的版本进行比较可能很有趣。不过,它对空间问题没有任何作用(事实上,它们可能比您的版本更糟)。
我有更快的版本,使用一个轮子,但它们更复杂。原始来源是 here .
好的,这是使用轮子的版本。
至于轮子是什么:好吧,你知道(除了2),所有的素数都是奇数,所以大多数筛子漏掉了所有的偶数。类似地,你可以更进一步,注意到所有素数(除了2和3)都与1或5模6(=2*3)一致,所以你只需要在筛子中存储这些数的条目就可以了。下一步要注意的是,所有素数(除了2、3和5)都与1、7、11、13、17、19、23、29(模30)中的一个一致(这里30==2*3*5),依此类推。 |
![]() |
6
3
当排除当前数字的倍数时,可以使用“set”方法来提高使用位串的速度。 所以关键部分变成
在我的机器上,这比原来的快3倍。
我的另一个想法是使用位串来表示奇数。然后您可以使用
[全面披露:我写了位串模块,所以我有一些自豪感在这里!] 作为比较,我也把bitstring方法的胆量去掉了,这样它就可以用同样的方法来做,但不需要进行范围检查等。我认为这为纯Python提供了一个合理的下限,它可以处理10亿个元素(不改变算法,我认为这是在欺骗!)
在我的机器上,这在大约0.62秒的时间内运行一百万个元素,这意味着它大约是位数组应答速度的四分之一。我认为这对于纯Python来说是很合理的。 |
![]() |
7
2
python的整数类型可以是任意大小的,所以不需要一个聪明的位串库来表示一组位,只需要一个数字。 这是密码。它可以轻松处理1000000个限额,甚至可以处理10000000个而不抱怨太多:
这个
|
![]() |
8
2
你可能想看的一个选项是编译C/C++模块,这样你就可以直接访问比特旋转特性。你可以写一些性质的东西,只返回在C/C++中完成计算的结果。现在我输入这个命令,您也可以看到numpy,它将数组存储为本机C以提高速度。不过,我不知道这是否比位串模块快! |
![]() |
9
1
另一个非常愚蠢的选择,但是如果你真的需要一个大量的素数列表,那会很有帮助。比如说,如果你需要他们作为一个工具来回答ProjectEuler的问题(如果问题只是把你的代码优化成一个智力游戏,那是不相关的)。
使用任何缓慢的解决方案来生成列表并将其保存到一个python源文件中。
现在要使用它们,你只需要做
即使您使用了一个不太优化的解决方案来生成这个列表,它也只会执行一次,而且并不重要。 你也许可以用泡菜/松饼来加快速度,但你明白了… |
![]() |
10
1
你可以用埃拉托斯滕的分段筛。用于每个段的内存将在下一个段中重用。 |
![]() |
11
1
这里有一些python3代码使用的内存比目前发布的bitarray/bitstring解决方案少,大约是robert william hanks的primesgen()的1/8内存,同时运行速度比primesgen()快(使用37kb内存时略快于1000000,使用34mb内存时略快于primesgen(),比primesgen()快3倍)。增加块大小(代码中的可变块)会使用更多的内存,但会加快程序的速度,直到达到一个限制——我选择了一个值,以便它对内存的贡献低于screen的n//30字节的10%。它的记忆效率不如 Will Ness's infinite generator (也见) https://stackoverflow.com/a/19391111/5439078 )因为它记录(并以压缩形式返回)所有计算出的素数。 只要平方根计算结果准确(如果python使用64位double,则约为2**51),这就可以正常工作。但是,您不应该使用这个程序来找到这么大的素数! (我没有重新计算补偿,只是从罗伯特·威廉·汉克斯的代码中提取了补偿。谢谢罗伯特!
旁注:如果你想要真正的速度,并且有2 GB的内存,那么你应该使用pyprimeshef(打开 https://pypi.python.org/ ,使用Prime谷粒筛 http://primesieve.org/ ) |
![]() |
Cam · Pandas列表日期到日期时间 6 月前 |
![]() |
LMC · Numpy数组布尔索引以获取包含元素 7 月前 |
![]() |
vr8ce · 非成对标记中特定字符的正则表达式 7 月前 |
![]() |
ShaAnder · 为什么sqllachemy返回的是类而不是字符串 7 月前 |
![]() |
Pernoctador · Python映射可以复制吗?我需要参考地图 7 月前 |