>我正在尝试解决应用程序中的瓶颈,这是两个矩阵的元素和。
我正在使用NumPy和Cython。我有一个带有矩阵属性的cdef
类。由于 Cython 仍然不支持类属性中的缓冲数组,因此我遵循了这一点并尝试使用指向矩阵的 data
属性的指针。问题是,正如结果所示,我确定我做错了什么。
我试图做的或多或少是以下几点:
cdef class the_class:
cdef np.ndarray the_matrix
cdef float_t* the_matrix_p
def __init__(self):
the_matrix_p = <float_t*> self.the_matrix.data
cpdef the_function(self):
other_matrix = self.get_other_matrix()
the_matrix_p += other_matrix.data
我严重怀疑添加两个 numpy 数组是您可以解决用 C 重写内容的瓶颈。请参阅以下代码,该代码使用 scipy.weave
:
import numpy as np
from scipy.weave import inline
a = np.random.rand(10000000)
b = np.random.rand(10000000)
c = np.empty((10000000,))
def c_sum(a, b, c) :
length = a.shape[0]
code = '''
for(int j = 0; j < length; j++)
{
c[j] = a[j] + b[j];
}
'''
inline(code, ['a', 'b', 'c', 'length'])
一旦你运行c_sum(a, b, c)
一次来编译 C 代码,这些是我得到的时间:
In [12]: %timeit c_sum(a, b, c)
10 loops, best of 3: 33.5 ms per loop
In [16]: %timeit np.add(a, b, out=c)
10 loops, best of 3: 33.6 ms per loop
因此,如果时序差异不是简单的随机噪声,那么在处理一千万个元素的数组时需要几毫秒的操作上,您似乎正在查看 .3% 的性能改进。如果它真的是一个瓶颈,这几乎无法解决它。
尝试编译 ATLAS 并在之后重新编译 numpy。这可能对加法没有帮助,但你可以通过更复杂的矩阵运算获得非常好的性能提升(当然,如果你使用这样的矩阵运算)。
看看这个简单的基准测试。如果您的结果与帖子中给出的结果相差太远,则可能是您的 numpy 没有与一些优化的 BLAS 实现相关联。