用于计算 pi 的多处理代码永远不会完成
Multiprocessing code to calculate pi never finishes
我想计算圆周率。程序很简单:
- 制作一个1x1的正方形,然后在正方形中画一个圆。然后除以 4.
- 取两个随机值(x, y)。
- 如果 x2 + y2 ≤ 1 则点在圆中。
- 重复以上N次
- 计算内部点数(我将其称为 K)并除以所有执行次数并乘以四。 (4 * K / N == Pi)
迭代次数越多,计算越准确
为了快速,我使用多处理库。但是多处理代码永远不会完成。有什么问题?
import timeit
start = timeit.default_timer()
import random
from multiprocessing import Pool
N = 1000000
process_num = 4
def make_pi(end):
count_inbound = 0
for x in range(end):
the_x = random.random()
the_y = random.random()
if((the_x**2 + the_y**2) <= 1):
count_inbound += 1
return count_inbound
# Multiprocessing.
p = Pool(processes = process_num)
count_in = p.map(make_pi, [N/process_num for x in range(process_num)])
print(4*sum(count_in)/N)
# Normal.
##print(4*make_pi(N)/N)
stop = timeit.default_timer()
print(stop - start)
我已经在 mac 上测试了相同的代码。
效果很好。
多进程为 0.25,单进程为 0.45。
只是改变
[N/process_num for x in range(process_num)]
至
[int(N/process_num for x in range(process_num)]
自己回答。
问题是进程需要关闭。
所以我只加了一行。
if __name__ == "__main__":
我的代码确实有效!
import timeit
start = timeit.default_timer()
import random
from multiprocessing import Pool
N = 1000000
process_num = 4
def make_pi(end):
count_inbound = 0
for x in range(end):
the_x = random.random()
the_y = random.random()
if((the_x**2 + the_y**2) <= 1):
count_inbound += 1
return count_inbound
if __name__ == "__main__":
#multiprocessing code
p = Pool(processes = process_num)
count_in = p.map(make_pi, [int(N/process_num) for x in range(process_num)])
print(4*sum(count_in)/N)
#normal code
#print(4*make_pi(N)/N)
stop = timeit.default_timer()
print(stop - start)
我想计算圆周率。程序很简单:
- 制作一个1x1的正方形,然后在正方形中画一个圆。然后除以 4.
- 取两个随机值(x, y)。
- 如果 x2 + y2 ≤ 1 则点在圆中。
- 重复以上N次
- 计算内部点数(我将其称为 K)并除以所有执行次数并乘以四。 (4 * K / N == Pi)
迭代次数越多,计算越准确
为了快速,我使用多处理库。但是多处理代码永远不会完成。有什么问题?
import timeit
start = timeit.default_timer()
import random
from multiprocessing import Pool
N = 1000000
process_num = 4
def make_pi(end):
count_inbound = 0
for x in range(end):
the_x = random.random()
the_y = random.random()
if((the_x**2 + the_y**2) <= 1):
count_inbound += 1
return count_inbound
# Multiprocessing.
p = Pool(processes = process_num)
count_in = p.map(make_pi, [N/process_num for x in range(process_num)])
print(4*sum(count_in)/N)
# Normal.
##print(4*make_pi(N)/N)
stop = timeit.default_timer()
print(stop - start)
我已经在 mac 上测试了相同的代码。 效果很好。
多进程为 0.25,单进程为 0.45。
只是改变
[N/process_num for x in range(process_num)]
至
[int(N/process_num for x in range(process_num)]
自己回答。
问题是进程需要关闭。
所以我只加了一行。
if __name__ == "__main__":
我的代码确实有效!
import timeit
start = timeit.default_timer()
import random
from multiprocessing import Pool
N = 1000000
process_num = 4
def make_pi(end):
count_inbound = 0
for x in range(end):
the_x = random.random()
the_y = random.random()
if((the_x**2 + the_y**2) <= 1):
count_inbound += 1
return count_inbound
if __name__ == "__main__":
#multiprocessing code
p = Pool(processes = process_num)
count_in = p.map(make_pi, [int(N/process_num) for x in range(process_num)])
print(4*sum(count_in)/N)
#normal code
#print(4*make_pi(N)/N)
stop = timeit.default_timer()
print(stop - start)