带有线程的python中的Eratosthenes筛

时间:2019-02-28 19:46:56

标签: python sieve-of-eratosthenes

是否可以在Python中使用线程对Eratosthenes筛进行编程以实现更快的输出?我见过很多用Python编写的Eratosthenes筛子,但从未见过带有线程的筛子。因为GIL不可能吗?

1 个答案:

答案 0 :(得分:0)

如果筛子要处理许多素数,这些素数足够大,需要将位图卸载到磁盘上,则使用线程可能变得很重要。由于筛子的性质,您必须期望线程之间存在很多争用,因为它们都希望更新相同的文件(至少在最初是这样)。

让我们说您使用位来表示标记数字在筛子中的位置,然后将其分解为8K文件(65536位),发现的第一个素数将在每个文件中都有更新,因此并行性的好处将因文件访问冲突而丢失。一旦您达到大于65536的质数,则混淆将减少很多,线程将开始带来一些好处。

您仍然必须找到一种方法来防止控制过程(找到下一个合格的编号并启动线程)继续进行线程的更新过程。

更好的策略可能是使块大小等于前几个素数的乘积。这将允许文件的初始创建使用一遍又一遍地重复的相同位图,并且还可以减少过程开始时的文件访问冲突。

例如,如果块大小为2 * 3 * 5 * 7(210),则您的文件将包含210位,并具有可重复模式,其中包括这4个因素的标记。即1..210的位与211..420、421..630的位相同。当然,您会使用大量因素来获得有意义的文件大小。