python 中带螺纹的埃拉托色尼筛法
Sieve of Eratosthenes in python with threading
是否可以在 Python 中使用线程对埃拉托色尼筛法进行编程以实现更快的输出?我看过很多用 python 编写的埃拉托色尼筛法,但从来没有一个有线程。是因为 GIL 不可能吗?
如果您的筛选器要处理大量素数,这些素数大到需要将位图卸载到磁盘,则使用线程可能变得相关。由于筛子的性质,您必须预料到线程之间会有很多争用,因为它们都想更新相同的文件(至少在最初是这样)。
假设您使用位来表示筛选中标记数字的位置,并将其分解为 8K 文件(65536 位),您找到的第一个素数将在每个文件中更新一些内容,因此好处并行性将因文件访问冲突而丢失。一旦达到大于 65536 的素数,冲突就会少很多,线程将开始带来一些好处。
您仍然需要找到一种方法来防止控制进程(找到下一个合格的数字并启动线程)在线程的更新进程之前移动。
更好的策略可能是使块大小等于前几个素数的乘积。这将允许文件的初始创建使用一遍又一遍重复的相同位图,并且还将减少过程开始时的文件访问冲突。
例如,如果块大小为 2*3*5*7 (210),您的文件将包含 210 位,并具有涵盖这 4 个因素标记的可重复模式。即 1..210 的位与 211..420、421..630 等的位相同。当然,您会使用更多因素来获得有意义的文件大小。
是否可以在 Python 中使用线程对埃拉托色尼筛法进行编程以实现更快的输出?我看过很多用 python 编写的埃拉托色尼筛法,但从来没有一个有线程。是因为 GIL 不可能吗?
如果您的筛选器要处理大量素数,这些素数大到需要将位图卸载到磁盘,则使用线程可能变得相关。由于筛子的性质,您必须预料到线程之间会有很多争用,因为它们都想更新相同的文件(至少在最初是这样)。
假设您使用位来表示筛选中标记数字的位置,并将其分解为 8K 文件(65536 位),您找到的第一个素数将在每个文件中更新一些内容,因此好处并行性将因文件访问冲突而丢失。一旦达到大于 65536 的素数,冲突就会少很多,线程将开始带来一些好处。
您仍然需要找到一种方法来防止控制进程(找到下一个合格的数字并启动线程)在线程的更新进程之前移动。
更好的策略可能是使块大小等于前几个素数的乘积。这将允许文件的初始创建使用一遍又一遍重复的相同位图,并且还将减少过程开始时的文件访问冲突。
例如,如果块大小为 2*3*5*7 (210),您的文件将包含 210 位,并具有涵盖这 4 个因素标记的可重复模式。即 1..210 的位与 211..420、421..630 等的位相同。当然,您会使用更多因素来获得有意义的文件大小。