分别采用单进程,多进程(有进程池,无进程池)以及多线程使用蒙特卡罗方法计算圆周率
单进程实现:
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)