如何通过多处理(并行处理)加速Python代码?

如何通过多处理(并行处理)加速Python代码?,python,parallel-processing,multiprocessing,netcdf,Python,Parallel Processing,Multiprocessing,Netcdf,我的python代码的功能非常简单。它通过文件列表读取netCDF文件,并在本例中返回平均值 但是,读取netCDF文件需要时间。我想知道我是否可以通过多处理(并行处理)来加速这个过程,因为我的工作站有32个核心处理器 代码如下所示: from netCDF4 import Dataset for i in filerange: print "Reading the",i, "file", "Wait" infile_Radar = Dataset(file_list[i],'

我的python代码的功能非常简单。它通过文件列表读取netCDF文件,并在本例中返回平均值

但是,读取netCDF文件需要时间。我想知道我是否可以通过多处理(并行处理)来加速这个过程,因为我的工作站有32个核心处理器

代码如下所示:

from netCDF4 import Dataset

for i in filerange:
    print "Reading the",i, "file", "Wait"
    infile_Radar = Dataset(file_list[i],'r')

    # Read the hourly Data
    Radar_rain=np.array(infile_Radar.variables['rain'][:])

    for h in range(0,24):
        hourly_rain = Radar_rain[h,:]
        hourly_mean[i,h] = np.mean(hourly_rain)

np.savetxt('Hourly_Spatial_mean.txt', hourly_mean, delimiter='\t')

既然读取文件是相互独立的,那么如何充分利用我的工作站呢?谢谢

看起来您正在寻找一个相当标准的线程实现。假设数据集构造函数是阻塞部分,您可能希望执行以下操作:

from threading import Thread

def CreateDataset( offset, files, datasets ):
   datasets[offset] = Dataset( files[i], 'r' )


threads   = [None] * len( filerange )
data_sets = [None] * len( filerange )

for i in filerange:
   threads[i] = Thread( None, CreateDataset, None, ( i, file_list, data_sets ) )
   threads[i].start();

for t in threads:
   t.join()

# Resume work with each item in the data_sets list
print "All Done";

然后对每个数据集执行您详细介绍的其余工作。无论实际的“慢东西”在哪里,这都是基本的方法。

看起来您正在寻找一个相当标准的线程实现。假设数据集构造函数是阻塞部分,您可能希望执行以下操作:

from threading import Thread

def CreateDataset( offset, files, datasets ):
   datasets[offset] = Dataset( files[i], 'r' )


threads   = [None] * len( filerange )
data_sets = [None] * len( filerange )

for i in filerange:
   threads[i] = Thread( None, CreateDataset, None, ( i, file_list, data_sets ) )
   threads[i].start();

for t in threads:
   t.join()

# Resume work with each item in the data_sets list
print "All Done";

然后对每个数据集执行您详细介绍的其余工作。无论实际的“慢东西”在哪里,这都是基本的方法。

线程而不是多处理似乎更适合于IO绑定的任务。有许多方法可以分发进程,但是,您必须确保输出不会相互覆盖。我看不到您在哪里读取文件。通过在一个流上重叠读取和处理另一个流,您可以得到一些改进,但这种放大仅限于此。我编辑了代码@特德莱尼。可以使用唯一的指示符修复覆盖。但我不知道如何分配流程。您能给我一些提示吗。@mootmootExplain这句话的意思是:“读取文件是相互独立的”。线程而不是多处理似乎更适合于IO绑定的任务。有很多方法可以分发进程,但是,您必须确保输出不会相互覆盖。我看不出您在哪里读取文件。通过在一个流上重叠读取和处理另一个流,您可以得到一些改进,但这种放大仅限于此。我编辑了代码@特德莱尼。可以使用唯一的指示符修复覆盖。但我不知道如何分配流程。您能给我一些提示吗?@mootmootExplain更多:“读取文件是相互独立的”。