我在我的 Python 代码中使用 C 连续内存视图,我想使用dgemm
需要 Fortran 连续内存视图的。我想使用在这里找到的函数PyMemoryView_GetContiguous但我不知道如何访问它。
有人知道我必须做什么进口吗?
我不想使用函数 copy_fortran() 因为它确实减慢了我的代码。
我在我的 Python 代码中使用 C 连续内存视图,我想使用dgemm
需要 Fortran 连续内存视图的。我想使用在这里找到的函数PyMemoryView_GetContiguous但我不知道如何访问它。
有人知道我必须做什么进口吗?
我不想使用函数 copy_fortran() 因为它确实减慢了我的代码。
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)