使用整数的 Numpy 点积非常慢
问题:使用整数的 Numpy 点积非常慢 抱歉这么多问题。我在 Intel core 2 Duo 上运行 Mac OSX 10.6。我正在为我的研究运行一些基准测试,但我遇到了另一件让我困惑的事情。 如果我跑 python -mtimeit -s 'import numpy as np; a = np.random.randn(1e3,1e3)' 'np.dot(a,a)' 我得到以下输出:10
问题:使用整数的 Numpy 点积非常慢
抱歉这么多问题。我在 Intel core 2 Duo 上运行 Mac OSX 10.6。我正在为我的研究运行一些基准测试,但我遇到了另一件让我困惑的事情。
如果我跑
python -mtimeit -s 'import numpy as np; a = np.random.randn(1e3,1e3)' 'np.dot(a,a)'
我得到以下输出:10 loops, best of 3: 142 msec per loop
但是,如果我运行
python -mtimeit -s 'import numpy as np; a = np.random.randint(10,size=1e6).reshape(1e3,1e3)' 'np.dot(a,a)'
我得到以下输出:10 loops, best of 3: 7.57 sec per loop
然后我跑了
python -mtimeit -s 'import numpy as np; a = np.random.randn(1e3,1e3)' 'a*a'
然后
python -mtimeit -s 'import numpy as np; a = np.random.randint(10,size=1e6).reshape(1e3,1e3)' 'a*a'
两者都以每个循环约 7.6 毫秒的速度运行,因此它不是乘法。添加也有相似的速度,所以这些都不应该影响点积,对吧?那么为什么使用整数计算点积比使用浮点数慢 50 倍以上呢?
解答
非常有趣,我很好奇它是如何实现的,所以我做了:
>>> import inspect
>>> import numpy as np
>>> inspect.getmodule(np.dot)
<module 'numpy.core._dotblas' from '/Library/Python/2.6/site-packages/numpy-1.6.1-py2.6-macosx-10.6-universal.egg/numpy/core/_dotblas.so'>
>>>
所以看起来它使用了BLAS
库。
所以:
>>> help(np.core._dotblas)
我从中找到了这个:
当 Numpy 使用 ATLAS 等加速 BLAS 构建时,这些函数将被替换以利用更快的实现。更快的实现只影响 float32、float64、complex64 和 complex128 数组。此外,BLAS API 仅包括矩阵-矩阵、矩阵-向量和向量-向量乘积。具有较大维度的数组的产品使用内置函数并且不加速。
所以看起来 ATLAS 微调了某些功能,但它只适用于某些数据类型,非常有趣。
所以是的,看起来我会更频繁地使用花车......
更多推荐
所有评论(0)