0

我在我的 Python 代码中使用 C 连续内存视图,我想使用dgemm需要 Fortran 连续内存视图的。我想使用在这里找到的函数PyMemoryView_GetContiguous但我不知道如何访问它。

有人知道我必须做什么进口吗?

我不想使用函数 copy_fortran() 因为它确实减慢了我的代码。

4

1 回答 1

0

PyMemoryView_GetContiguous不幸的是,作为 Cython 标准的一部分,它看起来并没有暴露出来。不过,它应该相当容易包装:

from cpython.buffer cimport PyBUF_READ # we'll need this later

cdef extern from "Python.h":
    # copy the signature replacing PyObject* with object to let Cython
    # handle the reference counting
    object PyMemoryView_GetContiguous(object, int, char)

def test(double[:,::1] c_contig):
   f_contig = PyMemoryView_GetContiguous(c_contig, PyBuf_READ,'F')
   # .... do something useful

请注意,这仍将涉及复制所有内存(这绝对是不可避免的!)因此不太可能比copy_fortran.


但是有一个问题 -PyMemoryView_GetContiguous除非它不必制作副本,否则不会返回可写的内存视图,并且 Cython 要求分配给类型化内存视图的东西是可写的,因此您只能将其用作 Python 对象。

不过,您可以获得指向第一个元素的指针 - 创建的基础对象是bytes/str对象,因此您可以char*将其转换为您需要的任何指针。这应该足以调用您的 Fortran 函数:

cdef char* as_bytes = f_contig.obj
some_function(<double*>as_bytes)
于 2017-07-17T17:07:23.480 回答