在前一篇文章里,我借助蒙特卡洛法对圆周率进行了估算,结果还是比较满意的,但是在试算过程中有一个问题很 annoying。更准确的结果需要更多的随机点,更多随机点意味着更大的矩阵计算,而且我在计算收敛情况时,需要多次执行求 pi 函数,但是我的 7700k 在计算时很不慌张,占有率仅在15%附近徘徊。矩阵乘法的并行加速我暂时还没有时间弄清楚,但是 for 的加速还是比较简单的,直接使用 multiprocessing 。代码如下:
import numpy as np
from multiprocessing import Pool # 引用线程池
def mc_pi(size):
ran_x = np.random.random([size, size])
ran_y = np.random.random([size, size])
<span class="n">is_c</span> <span class="o">=</span> <span class="n">ran_x</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">ran_y</span><span class="o">**</span><span class="mi">2</span>
<span class="n">is_c</span><span class="p">[</span><span class="n">is_c</span> <span class="o">></span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">pi</span> <span class="o">=</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">count_nonzero</span><span class="p">(</span><span class="n">is_c</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">size</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="k">return</span> <span class="n">pi</span>
if name == ’main’:
size = 2000
sizes = np.arange(10, size, 10)
pool = Pool(8) # 创建线程池,小于等于 cpu 的线程
pis = pool.map(mc_pi, sizes) # 计算函数和传入参数的 list 或 array 返回的是计算函数的返回值 list