Сито Эратосфена в питоне с резьбой - PullRequest
0 голосов
/ 28 февраля 2019

Можно ли запрограммировать Sieve of Eratosthenes на Python с многопоточностью, чтобы обеспечить более быстрый вывод?Я видел много Sieve of Eratosthenes, написанных на python, но никогда не имеющих потоков.Разве это невозможно из-за GIL?

1 Ответ

0 голосов
/ 01 марта 2019

Если ваше сито будет обрабатывать несколько простых чисел, достаточно больших, чтобы требовать выгрузки растровых изображений на диск, может оказаться целесообразным использовать потоки.Из-за природы решета вы должны ожидать много конфликтов между потоками, потому что все они захотят обновить одни и те же файлы (по крайней мере, на начальном этапе).

Допустим, вы используете биты для представления позицийпомеченных чисел в сите, и вы разбиваете их на 8K-файлы (65536 бит), первые найденные простые числа будут что-то обновлять в каждом отдельном файле, поэтому преимущества параллелизма будут потеряны из-за конфликтов доступа к файлам.Как только вы достигнете простых чисел, превышающих 65536, будет гораздо меньше конфликтов, и потоки начнут приносить некоторые преимущества.

Вам все равно придется найти способ предотвратить процесс управления (который находитследующий допустимый номер и запускает потоки), опережая процесс обновления потоков.

Лучшая стратегия может состоять в том, чтобы сделать размер чанка равным произведению первых нескольких простых чисел.Это позволило бы при первоначальном создании файлов использовать идентичное растровое изображение, повторяемое снова и снова, а также уменьшило бы конфликты доступа к файлам в начале процесса.

Например, если размер фрагмента равен 2 * 3 * 5 * 7 (210), ваши файлы будут содержать 210 битов с повторяющимся шаблоном, который охватывает маркировку этих 4 факторов.то есть биты для 1..210 такие же, как биты для 211..420, 421..630 и т. д.Конечно, вы должны использовать большее количество факторов, чтобы получить значимые размеры файлов.

...