gpt4 book ai didi

Python 多进程/线程循环。

转载 作者:行者123 更新时间:2023-12-01 03:02:55 25 4
gpt4 key购买 nike

我想做的是检查哪种多重处理最适合我的数据。我尝试多处理这个循环:

def __pure_calc(args):

j = args[0]
point_array = args[1]
empty = args[2]
tree = args[3]

for i in j:
p = tree.query(i)

euc_dist = math.sqrt(np.sum((point_array[p[1]]-i)**2))

##add one row at a time to empty list
empty.append([i[0], i[1], i[2], euc_dist, point_array[p[1]][0], point_array[p[1]][1], point_array[p[1]][2]])

return empty

仅纯函数就需要6.52秒。

我的第一个方法是 multiprocessing.map:

from multiprocessing import Pool 

def __multiprocess(las_point_array, point_array, empty, tree):

pool = Pool(os.cpu_count())

for j in las_point_array:
args=[j, point_array, empty, tree]
results = pool.map(__pure_calc, args)

#close the pool and wait for the work to finish
pool.close()
pool.join()

return results

当我检查如何多处理函数的其他答案时,它应该很简单:映射(调用函数,输入)-完成。但由于某种原因,我的多进程不排除我的输入,不断上升的错误表明 scipy.spatial.ckdtree.cKDTree 对象不可下标。

所以我尝试使用 apply_async:

from multiprocessing.pool import ThreadPool

def __multiprocess(arSegment, wires_point_array, ptList, tree):

pool = ThreadPool(os.cpu_count())

args=[arSegment, point_array, empty, tree]

result = pool.apply_async(__pure_calc, [args])

results = result.get()

它运行没有问题。对于我的测试数据,我设法在 6.42 秒内计算出来。

为什么 apply_async 可以毫无问题地接受 ckdtree 而 pool.map 却不能?我需要更改什么才能使其运行?

最佳答案

pool.map(function, iterable),它与itertool的map基本具有相同的占用空间。可迭代对象中的每一项都将是您的 __pure_calc 函数的 args

在这种情况下我猜你可能会变成这样:

def __multiprocess(las_point_array, point_array, empty, tree):

pool = Pool(os.cpu_count())

args_list = [
[j, point_array, empty, tree]
for j in las_point_array
]

results = pool.map(__pure_calc, args_list)

#close the pool and wait for the work to finish
pool.close()
pool.join()

return results

关于Python 多进程/线程循环。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43655496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com