我有一个数组,我想比较每个元素和其他元素,并建立一个交叉比较表。它可以很容易地通过嵌套for循环来实现,但是它的计算时间随着输入数组的大小呈指数增长,因此我想实现一种并行处理方法,以减少在较大大小时的时间消耗。你知道吗
我有一个数组,比如a = [1,2,3]
,我想应用一个自定义函数,比如:
def add_two_numbers(x,y):
return x+y
简单的嵌套for循环实现如下所示:
array = [1,2,3]
matrix = np.zeros([3,3])
for i, one_element in enumerate(array):
for j, other_element in enumerate(array):
matrix[i][j] = add_two_numbers(one_element, other_element)
输出为:
>>> matrix
1 2 3
______________
1 | 2 3 4
2 | 3 4 5
3 | 4 5 6
对于大型数组,用python应用并行处理的好方法是什么?
我使用python多处理库中的process类为一个n元素数组创建n个进程,但是每个进程都会在后端打开一个文件,1024个并行进程之后,会出现“打开的文件太多”异常。我必须使矩阵成为一个全局变量,这样每个进程都会更新一个特定的元素。你知道吗
import multiprocessing as mp
def add_two_numbers_process(one_element, array, i):
global matrix
for j, other_element in enumerate(array):
matrix[i][j] = add_two_numbers(one_element, other_element)
return
processes = []
for i, one_element in enumerate(array):
p = mp.Process(target=add_two_numbers_process, args=(one_element, array, i))
processes.append(p)
p.start()
for process in processes:
process.join()
我还使用了Pool类,但这比process类花费的时间多1000倍,这似乎不可行。你知道吗
import multiprocessing as mp
def add_two_numbers_pool(one_element, array, i):
row = [0 for x in range(len(array))]
for j, other_element in enumerate(array):
row[j] = add_two_numbers(one_element, other_element)
return row
pool = mp.Pool(mp.cpu_count())
matrix = [pool.apply(add_two_numbers_pool, args=(one_element, array, i)) for i, one_element in enumerate(array)]
pool.close()
我想不出使用分布式dask的方法。在这种情况下,dask是否有帮助?你知道吗
作为使用多处理和矢量化与非矢量化的区别的演示,我们可以从定义/引入共享代码开始:
我们可以做你天真的事情:
在我的笔记本电脑上大约需要3.5秒。然后我们可以将其移到使用
multiprocessing
Pool
和:这花了我大约1秒的时间,然后我们可以在
Pool
中用以下方法对其进行矢量化:这需要0.25秒,最后我们可以使用完全矢量化的numpy版本:
需要约0.09秒(90毫秒)。我还意识到,在处理如此大量的元素时,这些中间数组(
x
和y
)会占用大量的计算时间,并且对行进行矢量化更快:需要0.05秒(50毫秒)。你知道吗
希望这些例子能给你一些关于如何实现你的算法的想法!你知道吗
相关问题 更多 >
编程相关推荐