我正在尝试编写一个对一长串元素进行操作的程序(该列表在代码示例中称为 training_set )。列表的每一行包含两个必须在另一个称为 ID 的列表上找到的数字:因此,我的程序在 training_set 的行上进行迭代,并且对于每一行,在 ID 中找到对应的2个数字,然后执行更多计算(代码中未显示)。
对于顺序执行,这大约需要300秒。由于 training_set 的每一行都与其他行无关,因此我想通过使用 multiprocessing.Pool 将输入分成#cpu_cores来并行化计算。 但是,并行版本比顺序版本慢。
num_procs = int(multiprocessing.cpu_count())
with open("training_set.txt", "r") as f:
reader = csv.reader(f)
training_set = list(reader)
training_set = [element[0].split(" ") for element in training_set]
with open("node_information.csv", "r") as f:
reader = csv.reader(f)
node_info = list(reader)
IDs = [element[0] for element in node_info]
batch_size = int(len(training_set)/num_procs)
inputs=[]
# split list into batches to feed to the different threads
for i in range(num_procs):
if i == (num_procs-1): inputs.append(list(training_set[int(i*batch_size):(len(training_set)-1)]))
else: inputs.append(list(training_set[int(i*batch_size): int((i+1)*batch_size)]))
def init(IDs):
global identities
identities = copy.deepcopy(IDs)
def analyze_pairs(partialList):
pairsSet = copy.deepcopy(partialList)
for i in range(len(pairsSet)):
source = pairsSet[i][0] # an ID of edges
target = pairsSet[i][1] # an ID of edges
## find an index maching to the source ID
index_source = identities.index(source)
index_target = identities.index(target)
***additional computation***
if __name__ == '__main__':
pool = Pool(num_procs, initializer=init, initargs=(IDs,))
training_features = pool.map(analyze_pairs, inputs)
我没有显示for循环的其余代码(在 analyze_pairs()的末尾),因为即使我删除了该代码,问题仍然存在,因此并不存在问题存在。)
我知道有关此主题的问题已经很多,但是我找不到适合我的情况的解决方案。
我认为并行性不会带来比加速更多的开销,因为每个线程的输入量很大(在8个线程的cpu上,每个线程至少需要35s)并且没有显式的消息传递。我还尝试使用 copy.deepcopy 来确保每个线程都在单独的列表上工作(尽管这应该不成问题,因为每个线程仅在列表上执行“读取”操作),但是它没有用。
可能是什么问题?预先感谢。