0

我正在尝试解决我的应用程序中的瓶颈,这是两个矩阵的元素总和。

我正在使用 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
4

2 回答 2

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

因此,如果时序差异不仅仅是随机噪声,那么在处理一千万个元素的数组时需要几毫秒的操作时,您似乎正在寻找 0.3% 的性能改进。如果它真的是一个瓶颈,这很难解决它。

于 2013-01-25T18:00:37.623 回答
0

尝试编译 ATLAS 并在此之后重新编译 numpy。这可能对加法没有帮助,但是通过更复杂的矩阵运算(当然,如果您使用这种运算),您可以获得非常好的性能提升。

看看这个简单的基准。如果您的结果与帖子中给出的结果相差太远,那么您的 numpy 可能没有与某些优化的 BLAS 实现相关联。

于 2013-01-28T00:33:02.657 回答