python中大型数组的乘法

时间:2016-06-23 19:54:27

标签: python parallel-processing dask

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

我正在训练一个长度大约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?

1 个答案:

答案 0 :(得分:2)

.dot的效果很大程度上取决于您的NumPy实施所链接的BLAS library

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

如果你已经通过Anaconda安装了NumPy,那么你可能已经拥有了OpenBLAS或MKL,所以我会对你所拥有的性能感到满意,并且每天都会打电话给它。

但是,在您的实际示例中,您使用的是太小的块(chunks=(100,))。 dask任务调度程序每个任务产生大约一毫秒的开销。您应该选择一个chunksize,以便每个任务占用100s毫秒的某个位置,以隐藏这种开销。通常,一个好的经验法则是针对大小超过兆字节的块。这就是导致您看到的性能差异很大的原因。