一个模仿在 Matlab 中使用 parfor 的包。
项目描述
帕尔福
用于在 Matlab 中使用 parfor 并行化 for 循环?这个包允许你在 python 中做同样的事情。采用任何普通的串行但可并行的 for 循环并使用简单的语法并行执行它。不要担心使用多处理模块、竞争条件、队列的技术细节,parfor 会处理所有这些。
在 python 2.7 和 3.8 上的 linux 上以及在 python 3.8 上的 Windows 和 OSX 上进行了测试。
为什么 parfor 比仅使用多处理更好?
- 便于使用
- 使用 dill 代替 pickle:并行化时可以使用更多对象
- 进度条是内置的
安装
点安装 parfor
用法
Parfor 装饰一个函数并返回该函数在迭代器的每次迭代中并行计算的结果。
需要
tqdm, 莳萝
限制
传递给池的对象需要是 dillable(dill 需要序列化它们)。生成器和 SwigPyObjects 是不能使用的对象的例子。然而,它们可以用于使用 parfor 时的迭代器参数,但它的迭代需要是可删除的。无论如何,您都可以使用 dill.register 使对象可修饰。
并行评估的函数需要终止。如果 parfor 在似乎完成任务后挂起,可能是因为各个进程无法终止。导入 javabridge(在 python-bioformats 中使用)并启动 java 虚拟机可能会导致它挂起,因为进程仅在 java vm 退出后才会终止。在这种情况下,将 terminator=javabridge.kill_vm 传递给 parfor。
在 OSX 上,由于操作系统的限制,缓冲栏不起作用。
论据
必需的:
fun: function taking arguments: iteration from iterable, other arguments defined in args & kwargs
iterable: iterable from which an item is given to fun as a first argument
可选的:
args: tuple with other unnamed arguments to fun
kwargs: dict with other named arguments to fun
length: give the length of the iterator in cases where len(iterator) results in an error
desc: string with description of the progress bar
bar: bool enable progress bar
pbar: bool enable buffer indicator bar
rP: ratio workers to cpu cores, default: 1
nP: number of workers, default, None, overrides rP if not None
number of workers will always be at least 2
serial: switch to serial if number of tasks less than serial, default: 4
debug: if an error occurs in an iteration, return the erorr instead of retrying in the main process
返回
list with results from applying the decorated function to each iteration of the iterator
specified as the first argument to the function
例子
普通串行for循环
<<
from time import sleep
a = 3
fun = []
for i in range(10):
sleep(1)
fun.append(a*i**2)
print(fun)
>> [0, 3, 12, 27, 48, 75, 108, 147, 192, 243]
使用 parfor 进行并行化
<<
from time import sleep
from parfor import parfor
@parfor(range(10), (3,))
def fun(i, a):
sleep(1)
return a*i**2
print(fun)
>> [0, 3, 12, 27, 48, 75, 108, 147, 192, 243]
<<
@parfor(range(10), (3,), bar=False)
def fun(i, a):
sleep(1)
return a*i**2
print(fun)
>> [0, 3, 12, 27, 48, 75, 108, 147, 192, 243]
在脚本/模块/.py 文件中使用 parfor
Parfor 不应该在 .py 文件的导入阶段执行。为防止这种情况发生,请使用以下if __name__ == '__main__':
结构:
<<
from time import sleep
from parfor import parfor
if __name__ == '__main__':
@parfor(range(10), (3,))
def fun(i, a):
sleep(1)
return a*i**2
print(fun)
>> [0, 3, 12, 27, 48, 75, 108, 147, 192, 243]
或者:
<<
from time import sleep
from parfor import parfor
def my_fun(*args, **kwargs):
@parfor(range(10), (3,))
def fun(i, a):
sleep(1)
return a*i**2
return fun
if __name__ == '__main__':
print(my_fun())
>> [0, 3, 12, 27, 48, 75, 108, 147, 192, 243]
如果你讨厌装饰器不返回函数
pmap 将迭代器映射到类似于 map 的函数,但是是并行的
<<
from parfor import pmap
from time import sleep
def fun(i, a):
sleep(1)
return a*i**2
print(pmap(fun, range(10), (3,)))
>> [0, 3, 12, 27, 48, 75, 108, 147, 192, 243]
使用生成器
如果像列表和元组这样的迭代器对于内存来说太大了,请改用生成器。由于生成器没有预定义的长度,因此将 parfor 长度作为参数(可选)。
<<
import numpy as np
c = (im for im in imagereader)
@parfor(c, length=len(imagereader))
def fun(im):
return np.mean(im)
>> [list with means of the images]
额外的
地图
函数 parfor 装饰,像 map 一样使用它。
块
将长迭代器拆分为小块以并行化
鱼池
对并行执行的更多低级可访问性。随时提交任务并请求结果,(虽然必须先提交,然后请求特定任务),针对不同的任务使用不同的函数和函数参数。
Tqdm计
Meter bar,继承自 tqdm,用于显示缓冲区。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。