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 兆字节的块。这就是导致您看到的性能差异很大的原因。
我也有大数组可以在大量迭代中相乘。
我正在训练一个长度约为 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 兆字节的块。这就是导致您看到的性能差异很大的原因。