我有一个元组列表,它们在循环内使用来执行一些计算。计算可能需要一些时间,因此我想尝试将任务分配给多个处理核心(以加快速度)。这里出了点问题。
首先:我在运行代码时检查了每个核心的性能,并且使用了所有核心,但似乎(根据结果)每个核心都执行了相同的计算。例如:如果我想做 1+1、2+2 和 3+3,我想确保一个核心执行 1+1,一个核心执行 2+2,另一个核心执行 3+3。现在所有三个核心都执行 1+1、2+2 和 3+3(所以我得到了三次结果)。
第二件事是我检查了计算时间,使用多重处理比不使用多重处理花费更多时间,我认为这不应该发生。
我在下面做了一个小代码示例。所有需要一些时间的计算都是在函数“func”的 for 循环下执行的,这是我想要使用更多 CPU 核心的部分。示例代码可以直接测试,列表会减少到前 20 次迭代,这样就不会花费太长时间(如果需要,请调整此值)。
from multiprocessing import Process
import numpy as np
import itertools
import time
import math
def func(list_products):
# for i in range(len(list_total_product)):
for i in range(len(list_products)):
# Perform calculations
i
""" Creating the list """
# Input
item1_deviation = 1 #%
item1_steps = 10
item2_deviation = 10 #%
item2_N = 3 # minimum of 2
# Create first list
item1_base = 360
item1_deviation_rounded = item1_base * (item1_deviation / 100)
list_item1s = np.arange(item1_base - item1_deviation_rounded,
item1_base + item1_deviation_rounded+item1_deviation,
item1_steps).tolist()
list_item1s = [int(math.ceil(item / item1_steps)) * item1_steps for item in list_item1s]
# Create second list
item2_base = 0.77
list_item2s = np.linspace(item2_base - (item2_base * (item2_deviation / 100)),
item2_base + (item2_base * (item2_deviation / 100)),
item2_N).tolist()
list_item2s = [round(item, 3) for item in list_item2s]
# Create the number of combinations
list_total_sequence = []
for i in range(6):
list_sequence = [list_item1s, list_item2s]
list_product = list(itertools.product(*list_sequence))
list_total_sequence.append(list_product)
list_total_product = list(itertools.product(*list_total_sequence))
""" Without Multiprocessing """
t1 = time.perf_counter()
# for i in range(len(list_total_product)):
for i in range(len(list_total_product[0:20])):
# Perform calculations
i
t2 = time.perf_counter()
print(t2-t1)
""" With Multiprocessing """
if __name__ == '__main__':
t1 = time.perf_counter()
p = Process(target=func, args=(list_total_product[0:20],))
p.start()
p.join()
t2 = time.perf_counter()
print(t2-t1)
可以启用/禁用“不使用多重处理”和“使用多重处理”下的代码
我做错了什么?
您只创建了一个进程。如果你想创建多个进程,你需要做类似的事情
processes = []
for [1,2,3]:
processes.append(Process(target=func, args=(list_total_product[0:20],)))
for p in processes
p.start()
for p in processes
p.join()