Python多处理。池比顺序执行慢

时间:2018-11-25 22:16:26

标签: python multiprocessing threadpool

我正在尝试编写一个对一长串元素进行操作的程序(该列表在代码示例中称为 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 来确保每个线程都在单独的列表上工作(尽管这应该不成问题,因为每个线程仅在列表上执行“读取”操作),但是它没有用。
可能是什么问题?预先感谢。

0 个答案:

没有答案