由于ask.sagemath.org失效,我想我会在这里问这个......
我正在尝试使用sage中的random_prime
函数并行生成一堆随机素数。这是一些代码:
#!/usr/bin/env sage -python
from __future__ import print_function
from sage.all import *
import time
N = 100
B = 200
length = (1 << B) - 1
print('Generating primes (sequentially)')
start = time.time()
ps = []
for _ in xrange(N):
ps.append(random_prime(length))
end = time.time()
print('Took: %f seconds' % (end - start))
print(ps)
@parallel(ncpus=10)
def _random_prime(length):
return random_prime(length)
print('Generating primes (in parallel)')
start = time.time()
ps = [length] * N
ps = list(_random_prime(ps))
end = time.time()
print('Took: %f seconds' % (end - start))
ps = [p for _, p in ps]
print(ps)
第一次运行按顺序计算质数,它可以工作。
第二次运行使用sage的@parallel
装饰器计算它们。它在计算并行化的意义上“起作用”,但所有输出素数都是相同的(即,它不产生100个随机素数,而是产生100个相同随机素数的实例)。我认为这是@parallel
的常见用例,但我找不到有关此问题的详细信息。有人有主意吗?感谢。
答案 0 :(得分:1)
只是暗示一下 - 你是否有可能每次都要设置不同的种子?请注意,the doc在测试中没有#random
,因此所有并行实例的种子可能由于某种原因而相同(这似乎是合理的)。
编辑以将Volker的更详细描述如何执行此操作:
import os
import sage.misc.randstate as randstate
randstate.set_random_seed(os.getpid())