应用python进行数据挖掘或计算时,往往需要遍历多种参数进行数据建模,而单次的建模或计算有时候非常耗时,这时候可以利用python的并行计算功能,加快计算速度。
python能够应用并行计算的模块有多个multiprocessing、pathos等。其中multiprocessing模块应用的较多,但对于数据挖掘场景来说,pathos模块更实用,尤其允许输入多个可变参数非常简单实用。
1.环境&软件
2.功能实现
本文总结整理了常见的并行计算场景,编写parallel.py模块,主要利用pathos模块实现,可以实现单变量并行、多变量并行、并行嵌套等功能。通过tdqm模块增加了进度条,可以显示计算进度等信息,通过functools模块中的partial函数将静态参数冻结,以适应并行框架。
pip install pathos
# -*- coding:utf-8 -*-
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()
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的参数定义顺序需要注意:必选参数–任意位置参数–默认参数–任意关键字参数。
3.结果展示
定义另一个parallel_main.py模块,用来展示各个场景下并行计算结果。
# -*- coding:utf-8 -*-
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):
r = parallel(self.f1, [1, 2, 3], thread=True) # [2,3,4]
return x + sum(r)
def f6(self, x):
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)
运行parallel_main.py文件,结果如下:
4.总结&归纳
parallel函数使用注意点:
(1)函数至少输入一个被并行函数,和可迭代序列参数
(2)要显示计算过程,设置show=True
(3)被并行函数的依赖模块需要导入,否则报NameError
(4)嵌套并行需要导入parallel模块,且子并行需要设置为多线程模式(thread=True)
来源:https://zhuanlan.zhihu.com/p/102451932
应用python进行数据挖掘或计算时,往往需要遍历多种参数进行数据建模,而单次的建模或计算有时候非常耗时,这时候可以利用python的并行计算功能,加快计算速度。python能够应用并行计算的模块有多个multiprocessing、pathos等。其中multiprocessing模块应用的较多,但对于数据挖掘场景来说,pathos模块更实用,尤其允许输入多个可变参数非常简单实用。1.环境&软件win10 64bitPython 3.72.功能实现本文总结整理了常见的并行计算场景.
对于上级文件路径和再上一级的路径可以直接添加“..”,这样到时候导入模块的时候程序能在文件的上级目录直接去查找自己写的模块
查看添加成功的方法,但是添加的时候不要像我一样的随便添加,要么上级目录的简单的添加是sys.path.append(“..”)
另一种是需要添加完整的文件路径的,然后就能顺利的使用模块了
print sys.path查看你添加的路径,到时候寻找模块的时候就会在你的目录下面去寻找模块
给你们看一个示例
这里我要调用的是他的上级目录中的一个自己写的模块
本文实例讲述了Python OS模块。分享给大家供大家参考,具体如下:
os模块
在自动化测试中,经常需要查找操作文件,比如查找配置文件(从而读取配置文件的信息),查找测试报告等等,经常会对大量文件和路径进行操作,这就需要依赖os模块。
1. os.getcwd()
功能:查看当前所在路径
import os
print(os.getcwd())
2. os.listdir()
列举目录下所有的文件,返回的是列表类型
import os
print(os.listdir(c:\file))
3. os.path.abspath(path)
功能:返回path的绝对路径
pathos模块
1、pathos自身的多进程方法(pathos.multiprocessing.ProcessPool、pathos.multiprocessing.ProcessingPool、pathos.pools.ProcessPool)
2、映射multiprocess模块的多进程方法(pathos.multiprocessing.Pool)
3、映射pp模块的多进程方法1(pathos.pools.ParallelPool、pathos.pp.ParallelPool、patho
应用python进行数据挖掘或计算时,往往需要遍历多种参数进行数据建模,而单次的建模或计算有时候非常耗时,这时候可以利用python的并行计算功能,加快计算速度。
python能够应用并行计算的模块有多个multiprocessing、pathos等。其中multiprocessing模块应用的较多,但对于数据挖掘场景来说,pathos模块更实用,尤其允许输入多个可变参数非常简单实用。
问题描述:
学习mmap匿名映射的时候,先mmap,然后fork创建子进程,准备父子进程间通信,但是我用fork的返回值pid判断到底是父进程还是子进程时,父进程竟然也进入了if (0 == pid)的逻辑中,然后父进程也进入了if (pid > 0)的逻辑中,这到底是怎么回事,这个问题先记录下来,等高人解答。
代码如下:
#include <stdio.h>