Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,在多个cpu核上运行简单循环(处理不同数据)的最简单方法是什么?_Python_Multiprocessing_Multicore_Numba_Continuum - Fatal编程技术网

在python中,在多个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

我每年都会计算一些相对计算密集的数据。我使用了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和compute_matrix()方法的横截面对象

在多个核之间拆分此文件的最简单方法是什么

  • 如果有一个Numba风格的装饰器,可以自动分解循环并在不同的进程上运行它们,并将结果粘合在一起,那将是一件非常棒的事情。这是否存在

  • 我的最佳选择是使用Python.multiprocessing吗


  • 因此,有几件事你可以看一下:

    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倍吗?您可能希望调查为什么代码不能更有效地扩展。这是一个很好的观点,我将进一步研究这一点。。。这种方法的开销可能相对较高。