python--并行计算

作者: FTDdata | 来源:发表于2021-04-29 09:17 被阅读0次

应用python进行数据挖掘或计算时,往往需要遍历多种参数进行数据建模,而单次的建模或计算有时候非常耗时,这时候可以利用python的并行计算功能,加快计算速度。

python能够应用并行计算的模块有多个multiprocessing、pathos等。其中multiprocessing模块应用的较多,但对于数据挖掘场景来说,pathos模块更实用,尤其允许输入多个可变参数非常简单实用。

环境&软件

  • win 10 64bit
  • Python 3.7

功能实现

本文总结整理了常见的并行计算场景,编写parallel.py模块,主要利用pathos模块实现,可以实现单变量并行、多变量并行、并行嵌套等功能。通过tdqm模块增加了进度条,可以显示计算进度等信息,通过functools模块中的partial函数将静态参数冻结,以适应并行框架。
parallel.py

import time
from functools import partial
from pathos.pools import ProcessPool, ThreadPool
from tqdm import tqdm


def parallel(func, *args, show=False, thread=False, **kwargs):
    """
    并行计算
    :param func: 函数,必选参数
    :param args: list/tuple/iterable,1个或多个函数的动态参数,必选参数
    :param show:bool,默认False,是否显示计算进度
    :param thread:bool,默认False,是否为多线程
    :param kwargs:1个或多个函数的静态参数,key-word形式
    :return:list,与函数动态参数等长
    """

    # 冻结静态参数
    p_func = partial(func, **kwargs)
    # 打开进程/线程池
    pool = ThreadPool() if thread else ProcessPool()
    try:
        if show:
            start = time.time()
            # imap方法
            with tqdm(total=len(args[0]), desc="计算进度") as t:  # 进度条设置
                r = []
                for i in pool.imap(p_func, *args):
                    r.append(i)
                    t.set_postfix({'并行函数': func.__name__, "计算花销": "%ds" % (time.time() - start)})
                    t.update()
        else:
            # map方法
            r = pool.map(p_func, *args)
        return r
    except Exception as e:
        print(e)
    finally:
        # 关闭池
        pool.close()  # close the pool to any new jobs
        pool.join()  # cleanup the closed worker processes
        pool.clear()  # Remove server with matching state

函数parallel的参数定义顺序需要注意:必选参数--任意位置参数--默认参数--任意关键字参数

结果展示

定义另一个parallel_main.py模块,用来展示各个场景下并行计算结果。
parallel_main.py

from parallel import parallel


class A:
    @staticmethod
    def f1(x):
        return x + 1

    @staticmethod
    def f2(x, y):
        return x + y

    @staticmethod
    def f3(x, y, p=100):
        return x + y + p

    @staticmethod
    def f4(x):
        import time
        time.sleep(1)
        return x + 1

    def f5(self, x):
        from parallel import parallel
        r = parallel(self.f1, [1, 2, 3], thread=True)  # [2,3,4]
        return x + sum(r)

    def f6(self, x):
        from parallel import parallel
        r1 = parallel(self.f1, [1, 2, 3], thread=True)  # [2,3,4]
        r2 = parallel(self.f2, [1, 2, 3], r1, thread=True)  # [3,5,7]
        return x + sum(r2)


if __name__ == '__main__':
    f = A()
    print("f1计算结果(单参数并行模式):", parallel(f.f1, [1, 2, 3]), "\n", "#" * 50)
    print("f2计算结果(多参数并行模式):", parallel(f.f2, [1, 2, 3], [4, 5, 6]), "\n", "#" * 50)
    print("f3计算结果(多参数并行+函数参数模式):", parallel(f.f3, [1, 2, 3], [4, 5, 6], p=200), "\n", "#" * 50)
    print("f4计算结果(进度显示):", parallel(f.f4, range(100), show=True), "\n", "#" * 50)
    print("f5计算结果(2层嵌套并行模式):", parallel(f.f5, range(10)), "\n", "#" * 50)
    print("f6计算结果(多层嵌套并行模式):", parallel(f.f6, range(10)), "\n", "#" * 50)
1.png

总结

parallel函数使用注意点:

  • 函数至少输入一个被并行函数,和可迭代序列参数
  • 要显示计算过程,设置show=True
  • 被并行函数的依赖模块需要导入,否则报NameError
  • 嵌套并行需要导入parallel模块,且子并行需要设置为多线程模式(thread=True)

相关文章

  • python--并行计算

    应用python进行数据挖掘或计算时,往往需要遍历多种参数进行数据建模,而单次的建模或计算有时候非常耗时,这时候可...

  • Python--报错RecursionError: maximu

    Python--报错RecursionError: maximum recursion depth exceede...

  • Python--报错TabError: inconsistent

    Python--报错TabError: inconsistent use of tabs and spaces i...

  • 第一章 大数据处理技术简介

    并行计算技术 并行计算:定义: 同时对多条指令,多个任务或多个数据进行处理的一种计算技术并行计算系统:实现并行计算...

  • 并行计算

    并行计算机 并行计算机分类 数据与指令 SIMD 单条指令并行计算多条数据,如 A=A+1(备注:其中A为数组) ...

  • 指北 | 谈谈ForkJoin框架的设计与实现

    在了解Fork-Join之前,我们得先了解什么是并行计算。 并行计算 相对于串行计算,并行计算可以划分成时间并行和...

  • 2018-01-16

    Python--查看函数的参数列表 import inspect inspect.getargspec(函数名) ...

  • Spark并行计算内容总结

    (一)并行计算的简介 并行计算:简单来讲,并行计算就是同时使用多个计算资源来解决一个计算问题,具有以下特点: 一个...

  • XGBoost面试题详解

    FAQ 1. XGBoost如何进行并行计算?XGBoost是基于Boosting思想,其并行计算不是在Tree层...

  • 对等模式 实现Jacobi迭代的并行计算 C++版

    两小时入门MPI与并行计算(五):对等模式(实现Jacobi迭代的并行计算)[https://zhuanlan.z...

网友评论

    本文标题:python--并行计算

    本文链接:https://www.haomeiwen.com/subject/ijtrhltx.html