在Python 3中并行化for循环

时间:2018-07-13 12:59:00

标签: python python-3.x multiprocessing python-multiprocessing python-multithreading

我正在尝试对MODIS卫星数据进行一些分析。我的代码主要读取许多尺寸为1200 x 1200(806 * 1200 * 1200)的文件(806)。它使用for loop进行并执行数学运算。

以下是我读取文件的一般方法。

mindex=np.zeros((1200,1200))
for i in range(1200):
    var1 = xray.open_dataset('filename.nc')['variable'][:,i,:].data
    for j in range(1200):
        var2 = var1[:,j]
        ## Mathematical Calculations to find var3[i,j]## 
        mindex[i,j] = var3[i,j]

由于要处理大量数据,因此该过程非常缓慢,我正在考虑对其进行并行化。我曾尝试用joblib做某事,但我一直做不到。

我不确定如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

我的猜测是您想同时处理多个文件。为此,最好的方法(我认为)是使用multiprocessing。要使用此功能,您需要定义一个基本步骤,并且该步骤已在您的代码中完成。

import numpy as np
import multiprocessing as mp
import os

def compute(file):
    mindex=np.zeros((1200,1200))
    for i in range(1200):
        var1 = xray.open_dataset(file)['variable'][:,i,:].data
        for j in range(1200):
            var2 = var1[:,j]
            ## Mathematical Calculations to find var3[i,j]## 
            mindex[i,j] = var3[i,j]
    return (file, mindex)


if __name__ == '__main__':
    N= mp.cpu_count()

    files = os.scandir(folder)

    with mp.Pool(processes = N) as p:
        results = p.map(f, [file.name for file in files])

这应该返回元素results的列表,其中每个元素都是具有文件名和mindex矩阵的元组。这样,您可以同时处理多个文件。如果每个文件的计算时间较长,则特别有效。