使用指向 numpy 数组数据属性的指针



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

我正在使用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 实现相关联。

相关内容

  • 没有找到相关文章

最新更新