`numpy.dot`中的数组顺序
在Python的数值库NumPy中,numpy.dot
函数是如何处理不同内存顺序的数组的?比如numpy.dot(c-order, f-order)
和dot(f-order, c-order)
等。
我之所以问这个问题,是因为很久以前(大概是numpy 1.0.4版本?),我做了一些测试,发现numpy.dot
的性能比直接调用scipy.linalg
中的dgemm
要差,尽管它们内部都调用了同一个BLAS库。我怀疑原因是numpy.dot
在处理输入矩阵时进行了复制,如果输入矩阵很大,这就很糟糕了。
现在我又试了一次,发现其实numpy.dot
的性能和dgemm
是一样的,所以没有必要再手动设置数组的特定顺序和转置标志。这样代码看起来更简洁。
所以我的问题是,最近的(比如1.6.0版本)numpy.dot
是怎么工作的?什么时候会进行复制,什么时候又不会?我主要关心的是1)内存 2)性能。谢谢。
1 个回答
1
你看到的情况可能和一个叫做blas优化的点积导入错误有关,这个错误被悄悄处理了(这段代码来自numeric.py)。
# try to import blas optimized dot if available
try:
# importing this changes the dot function for basic 4 types
# to blas-optimized versions.
from _dotblas import dot, vdot, inner, alterdot, restoredot
except ImportError:
# docstrings are in add_newdocs.py
inner = multiarray.inner
dot = multiarray.dot