如何通过多处理(并行处理)加速Python代码?
我的python代码的功能非常简单。它通过文件列表读取netCDF文件,并在本例中返回平均值 但是,读取netCDF文件需要时间。我想知道我是否可以通过多处理(并行处理)来加速这个过程,因为我的工作站有32个核心处理器 代码如下所示:如何通过多处理(并行处理)加速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],'
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更多:“读取文件是相互独立的”。