为什么要多进程:为了提高运算速度!多进程相当于将简单重复的任务分配到多个cpu内核上,让它们同时做互不相关的工作,从而提高系统的运行效率。
=======
星星之火,可以燎原
HEAD
为什么要多进程:为了提高运算速度!多进程相当于将简单重复的任务分配到多个cpu内核上,让它们同时做互不相关的工作,从而提高系统的运行效率。
=======为什么要多进程:为了提高运算速度!多进程相当于将简单重复的任务分配到多个cpu内核上,让它们同时做互不相关的工作,从而提高系统的运行效率。
>>>>>>> 4ef99384a791603d1ae54a12162221aa23eb330e测试例程①
import random
import time
from multiprocessing import Pool
data = [(random.randint(1, 1000), random.randint(1, 1000)) for _ in range(10000)]
# 函数式编程
# 第一步:创建管道函数
def greatest_common_factor(a, b):
"""
此函数求取输入两个参数的最大公因数
:param a:
:param b:
:return:
"""
r = a % b
while r != 0:
a = b
b = r
r = a % b
return b
def simplify(pair):
"""
此函数将输入的数据对转化为最简形式
:param pair:
:return:
"""
n1, n2 = pair
m = greatest_common_factor(n1, n2)
return int(n1 / m), int(n2 / m)
if __name__ == '__main__':
# 第二步:将数据输入管道
t1 = time.time()
res1 = map(simplify, data)
res1 = list(res1)
t2 = time.time()
print(t2 - t1)
p = Pool(processes=4)
t3 = time.time()
res2 = p.map(simplify, data)
res2 = list(res2)
p.close() # 关闭进程池,不再接受新的进程
p.join() # 主进程阻塞,等待子进程推出
t4 = time.time()
print(t4 - t3)
# (t2 - t1) = 0.004999637603759766
# (t4 - t3) = 0.3481013774871826
点评:我们能发现,在这个案例中,开了多进程的处理程序反而更慢一些,这违反了我们的直觉。事实上,这是因为我们处理的过程比较简单,所以python底层对其优化做的比较好,不需要通过调用多进程的方式进行加速。如果我们需要体现出多进程的优势,那么就需要模拟进行复杂计算的过程,如下所示
测试例程②
import random
import time
from multiprocessing import Pool
data = [(random.randint(1, 1000), random.randint(1, 1000)) for _ in range(20)]
# 函数式编程
# 第一步:创建管道函数
def greatest_common_factor(a, b):
"""
此函数求取输入两个参数的最大公因数
:param a:
:param b:
:return:
"""
r = a % b
while r != 0:
a = b
b = r
r = a % b
return b
def simplify(pair):
"""
此函数将输入的数据对转化为最简形式
:param pair:
:return:
"""
n1, n2 = pair
m = greatest_common_factor(n1, n2)
# 模拟进行耗时的复杂运算
time.sleep(0.1)
return int(n1 / m), int(n2 / m)
if __name__ == '__main__':
# 第二步:将数据输入管道
t1 = time.time()
res1 = map(simplify, data)
res1 = list(res1)
t2 = time.time()
print(t2 - t1)
p = Pool(processes=4)
t3 = time.time()
res2 = p.map(simplify, data)
res2 = list(res2)
p.close() # 关闭进程池,不再接受新的进程
p.join() # 主进程阻塞,等待子进程推出
t4 = time.time()
print(t4 - t3)
# (t2 - t1) = 2.1878116130828857
# (t4 - t3) = 0.9278745651245117
<<<<<<< HEAD