计算圆周率使用python

分别采用单进程,多进程(有进程池,无进程池)以及多线程使用蒙特卡罗方法计算圆周率

单进程实现:

import random
def pi(n):
    count = 0
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        if x**2 + y**2 <= 1:
            count += 1
    return 4 * count / n
print(pi(1000000))

多进程(有进程池)实现:

import random
from multiprocessing import Pool

def pi(n):
    count = 0
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        if x**2 + y**2 <= 1:
            count += 1
    return count

if __name__ == '__main__':
    with Pool(processes=4) as pool:
        result = pool.map(pi, [250000]*4)
    print(4 * sum(result) / (250000*4))

多进程(无进程池)实现:

import random
from multiprocessing import Process, Value

def pi(n, count):
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        if x**2 + y**2 <= 1:
            with count.get_lock():
                count.value += 1

if __name__ == '__main__':
    n = 1000000
    count = Value('i', 0)
    p1 = Process(target=pi, args=(n//4, count))
    p2 = Process(target=pi, args=(n//4, count))
    p3 = Process(target=pi, args=(n//4, count))
    p4 = Process(target=pi, args=(n//4, count))
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p1.join()
    p2.join()
    p3.join()
    p4.join()
    print(4 * count.value / n)

多线程实现:

import random
from threading import Thread, Lock

def pi(n, count, lock):
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        if x**2 + y**2 <= 1:
            with lock:
                count += 1
    return count

if __name__ == '__main__':
    n = 1000000
    count = 0
    lock = Lock()
    t1 = Thread(target=pi, args=(n//4, count, lock))
    t2 = Thread(target=pi, args=(n//4, count, lock))
    t3 = Thread(target=pi, args=(n//4, count, lock))
    t4 = Thread(target=pi, args=(n//4, count, lock))
    t1.start()
    t2.start()
    t3.start()
    t4.start()
    t1.join()
    t2.join()
    t3.join()
    t4.join()
    print(4 * count / n)