我正在尝试解决我的应用程序中的瓶颈问题,这是两个矩阵的元素总和。
我正在使用NumPy和Cython。我有一个带有matrix属性的cdef
类。由于Cython仍然不支持类属性中的缓冲区数组,因此我遵循this并尝试使用指向矩阵的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
答案 0 :(得分:1)
我严重怀疑添加两个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
因此,如果时序差异不仅仅是随机噪声,那么在处理千万个元素阵列时需要花费少量ms的操作似乎正在寻找性能提升0.3%的东西。如果它确实是一个瓶颈,那么这很难解决它。
答案 1 :(得分:0)
尝试编译ATLAS并在此之后重新编译numpy。这对于添加可能没什么帮助,但是你可以通过更复杂的矩阵运算来提高性能(当然,如果使用这样的话)。
查看此simple benchmark。如果您的结果与帖子中给出的结果相差太远,那么您的numpy可能与某些优化的BLAS实现没有关联。