Python 多处理过滤数组
Python filter array with multiprocessing
现在我正在使用
过滤数组
arr = [a for a in tqdm(replays) if check(a)]
然而,对于数十万个元素,这会花费很多时间。我想知道是否可以通过多处理来做到这一点,最好是以一种漂亮而紧凑的 pythonic 方式。
谢谢!
我在尝试对数十万个元素进行分组时遇到了同样的问题,解决方案是使用 https://docs.python.org/3/library/itertools.html
性能提高了很多,但是当 sorting/grouping/filtering 内存中的大集合
时,看起来 python 有一些问题
定义一个multiprocessing-using并行过滤函数pfilter
:
from multiprocessing import Pool
def pfilter(filter_func, arr, cores):
with Pool(cores) as p:
booleans = p.map(filter_func, arr)
return [x for x, b in zip(arr, booleans) if b]
async
表示元素之间的执行顺序是真正相互独立的。
您的使用情况是 (4 cpus):
arr = pfilter(check, tqdm(replays), 4)
然而,由于一些奇怪的原因,filter_func 不允许是 lambda 表达式或定义为一个 ...
concurrent.futures 模块为多线程和多进程操作提供了一个很好的接口。
def check(a):
return (a % 2 == 0)
if __name__ == "__main__":
array = [1,2,3,4,5]
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor(max_workers=3) as ppe:
res = [a for a, flg in zip(array, ppe.map(check, array)) if flg]
print(res)
# [2,4]
现在我正在使用
过滤数组arr = [a for a in tqdm(replays) if check(a)]
然而,对于数十万个元素,这会花费很多时间。我想知道是否可以通过多处理来做到这一点,最好是以一种漂亮而紧凑的 pythonic 方式。
谢谢!
我在尝试对数十万个元素进行分组时遇到了同样的问题,解决方案是使用 https://docs.python.org/3/library/itertools.html
性能提高了很多,但是当 sorting/grouping/filtering 内存中的大集合
时,看起来 python 有一些问题定义一个multiprocessing-using并行过滤函数pfilter
:
from multiprocessing import Pool
def pfilter(filter_func, arr, cores):
with Pool(cores) as p:
booleans = p.map(filter_func, arr)
return [x for x, b in zip(arr, booleans) if b]
async
表示元素之间的执行顺序是真正相互独立的。
您的使用情况是 (4 cpus):
arr = pfilter(check, tqdm(replays), 4)
然而,由于一些奇怪的原因,filter_func 不允许是 lambda 表达式或定义为一个 ...
concurrent.futures 模块为多线程和多进程操作提供了一个很好的接口。
def check(a):
return (a % 2 == 0)
if __name__ == "__main__":
array = [1,2,3,4,5]
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor(max_workers=3) as ppe:
res = [a for a, flg in zip(array, ppe.map(check, array)) if flg]
print(res)
# [2,4]