【发布时间】:2018-03-07 10:43:19
【问题描述】:
我有如下代码
def yield_multiple():
for prime in prime_list:
for multiple in range(prime+prime, end, prime):
yield multiple
我用它来获取素数
multiple_set = set(yield_multiple())
result = [v for v in candidate_list if v not in multiple_set]
而且我在set很大的时候遇到内存错误,所以想用这个来节省内存
result = [v for v in candidate_list if v not in yield_multiple()]
但这会得到错误的结果。那么,如何避免内存错误以正确获取素数呢?
这是我改进的解决方案,没有太多内存可供使用。
import math
import sys
import time
from mpi4py import MPI
import eratosthenes
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
TAG_RESULT = 0
n = sys.argv[1]
if n.isdigit():
start_time = time.time()
n = int(n)
sqrt_n = int(math.sqrt(n))
task_per_block = int(math.ceil((n - 1) / size))
begin = 2 + rank * task_per_block
end = begin + task_per_block if begin + task_per_block <= n + 1 else n + 1
if rank == 0:
begin = sqrt_n if sqrt_n < end else begin
sieve_list = [True] * (end - begin)
prime_list = eratosthenes.sieve(sqrt_n)
if rank == 0:
result = sum(prime_list)
for prime in prime_list:
start = begin if begin % prime == 0 else (int(begin / prime) + 1) * prime
for multiple in range(start, end, prime):
sieve_list[multiple - begin] = False
result += sum(i + begin for i, v in enumerate(sieve_list) if v)
result_received = 0
while result_received < size - 1:
data = comm.recv(source=MPI.ANY_SOURCE, tag=TAG_RESULT)
result += data
result_received += 1
print(result)
print(time.time() - start_time)
else:
for prime in prime_list:
start = begin if begin % prime == 0 else (int(begin / prime) + 1) * prime
for multiple in range(start, end, prime):
sieve_list[multiple - begin] = False
result = sum(i + begin for i, v in enumerate(sieve_list) if v)
comm.send(result, dest=0, tag=TAG_RESULT)
【问题讨论】:
-
当您尝试提取素数时,为什么要使用
for multiple in range(prime, end, prime)?您可能想看看 Sieve 或 Eratosthenes 算法。 -
@cᴏʟᴅsᴘᴇᴇᴅ 是的,我知道埃拉托色尼筛。但我试图做一个扰乱版的埃拉托色尼筛。所以这是获得给定范围内所有倍数的好方法
-
对于分布式筛子,您可能需要合并树中的多个流,例如喜欢the one here。
-
@WillNess 你是对的。应该是
for multiple in range(prime+prime, end, prime) -
@WillNess 我现在有了更好的解决方案。你可以在上面检查它。当我使用 48 核时,它会比单核快 20 倍
标签: python concurrency parallel-processing primes sieve-of-eratosthenes