在python中,在多个cpu核上运行简单循环(处理不同数据)的最简单方法是什么?
我每年都会计算一些相对计算密集的数据。我使用了numba(非常有效)来减少运行迭代计算数据所需的时间。然而,考虑到我有20年的独立数据,我想把它们分成5组,每组4个,可以运行4个不同的cpu核在python中,在多个cpu核上运行简单循环(处理不同数据)的最简单方法是什么?,python,multiprocessing,multicore,numba,continuum,Python,Multiprocessing,Multicore,Numba,Continuum,我每年都会计算一些相对计算密集的数据。我使用了numba(非常有效)来减少运行迭代计算数据所需的时间。然而,考虑到我有20年的独立数据,我想把它们分成5组,每组4个,可以运行4个不同的cpu核 def compute_matrices(self): for year in self.years: self.xs[year].compute_matrix() 在上面的代码段中,函数是类中包含属性year和xs的方法year只是一个整数年,xs是一个包含xs.data和c
def compute_matrices(self):
for year in self.years:
self.xs[year].compute_matrix()
在上面的代码段中,函数是类中包含属性year和xs的方法year
只是一个整数年,xs
是一个包含xs.data和compute_matrix()方法的横截面对象
在多个核之间拆分此文件的最简单方法是什么
因此,有几件事你可以看一下: NumbaPro:。这基本上是一种类固醇,为多核和多核架构提供支持。不幸的是,它并不便宜 Numexpr:。这是一个用于实现超线程的numpy数组的表达式计算器 Numexpr Numba(实验):。顾名思义,这是使用Numba后端的Numexpr 很多答案将取决于您的
计算矩阵
方法所做的工作
最快的(就开发时间而言)解决方案可能是使用
多处理库拆分计算。需要注意的是,如果您的计算矩阵函数没有副作用,那么使用多处理就更容易了。对于复杂对象,我遇到的最简单的方法是利用IPython并行计算引擎
只需使用:ipcluster start-n4
或使用笔记本即可运行Ipython集群
然后可以迭代分配给不同客户机的xs对象
def multicore_compute_matrices(self):
from IPython.parallel import Client
c = Client()
xs_list = []
years = sorted(self.years)
# - Ordered List of xs Objects - #
for year in years
xs_list.append(self.xs[year])
# - Compute across Clusters - #
results = c[:].map_sync(lambda x: x.compute_matrix(), xs_list)
# - Assign Results to Current Object - #
year = years[0]
for result in results:
self.xs[year].matrix = result
year += 1
墙时间%Time
结果:
%time A.compute_matrices()
Wall Time: 5.53s
%time A.multicore_compute_matrices():
Wall Time: 2.58s
compute_matrix()中有一堆代码,由于严重依赖数据帧对象等,无法与@autojit
一起使用。但是在各个步骤的下面,我使用@autojit decorator将计算循环转换为单独的例程,这非常有效。现在我想把每年的工作并行地分出来。要做到这一点,你需要改变一些事情。传递给进程
实例的对象必须是可pickle的。有关更多信息,请参阅此问题:4核的速度是2倍吗?您可能希望调查为什么代码不能更有效地扩展。这是一个很好的观点,我将进一步研究这一点。。。这种方法的开销可能相对较高。