python 中大数组的乘法

multiplication of large arrays in python

我也有大数组可以在大量迭代中相乘。

我正在训练一个长度约为 1500 的数组模型,我将执行 3 次乘法运算大约 1000000 次,这将花费将近一周的时间。

我找到了 Dask 我试图将它与普通的 numpy 方式进行比较,但我发现 numpy 更快:

x = np.arange(2000)

start = time.time()
y = da.from_array(x, chunks=(100))

for i in range (0,100):
    p = y.dot(y)

#print(p)
print( time.time() - start)

print('------------------------------')

start = time.time()

p = 0

for i in range (0,100):
    p = np.dot(x,x)

print(time.time() - start)

0.08502793312072754

0.00015974044799804688

我是用错了 dask 还是 numpy 这么快?

.dot 的性能在很大程度上取决于您的 NumPy 实现链接到的 BLAS library

如果您有像 OpenBLAS 或 MKL 这样的现代实现,那么 NumPy 已经 运行 全速使用您的所有内核。在这种情况下,dask.array 可能只会妨碍,在 none 被保证时尝试进一步增加并行性,导致线程争用。

如果您已经通过 Anaconda 安装了 NumPy,那么您可能已经安装了 OpenBLAS 或 MKL,所以我会对您的性能感到满意并收工。

但是,在您的实际示例中,您使用的块太小 (chunks=(100,))。 dask 任务调度程序为每个任务带来大约一毫秒的开销。您应该选择一个块大小,以便每个任务花费 100 毫秒以内的某处,以隐藏此开销。一般来说,一个好的经验法则是针对大小超过 1 兆字节的块。这就是导致您看到的性能差异很大的原因。