如何在python中并行化一个简单循环?

时间:2019-04-03 11:26:15

标签: python loops parallel-processing

我有一个循环,每次都会使我的RAM崩溃,我想进行并行化。

我尝试了此代码,但没有成功:

from joblib import Parallel, delayed

from Bio.Align.Applications import ClustalOmegaCommandline


def run(test):
    im = process_image(Image.open(test['Path'][i]))
    test_images.append(im)


if __name__ == "__main__":
    test_images = []
    test = range(len(test))

    Parallel(n_jobs=len(test)(
        delayed(run)(i) for i in len(test))

我收到此错误:

文件“”,第16行     len(test)中的i的延迟(运行)(i))                                        ^ SyntaxError:解析时出现意外的EOF

我的循环:

test_images = []
for i in range(len(test)):
  im = process_image(Image.open(test['Path'][i]))
  test_images.append(im)
test_images = np.asarray(test_images)

我尝试了几种解决方案,但是我需要一个数据库输出。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方法吗?

def process_image(img_path):
    img_obj = Image.open(img_path)
    # your logic here
    return im

def main():
    image_dict = {}
    with concurrent.futures.ProcessPoolExecutor() as executor:
        for img_path, im in zip(test['Path'], executor.map(process_image, test['Path'])):
            image_dict[img_path] = im
    return image_dict

if __name__ == '__main__':
    image_dict = main()
    test_images = np.asarray(image_dict.values())

答案 1 :(得分:0)

我不确定,并行化是否可以解决内存问题。

您是否需要将每个图像存储在一个列表中,该列表存储在内存中?也许只是保存路径并在需要时加载它?

或尝试generators。在那里,这些值是延迟生成的(仅在需要时才生成),从而减少了内存消耗。