相关疑难解决方法(0)

为类型化内存视图分配内存的推荐方法是什么?

有关类型化内存视图Cython文档列出了三种分配给类型化内存视图的方法:

  1. 从原始C指针,
  2. 来自np.ndarray
  3. 来自a cython.view.array.

假设我没有从外部传入我的cython函数的数据,而是想分配内存并将其作为a返回np.ndarray,我选择了哪些选项?还假设该缓冲区的大小不是编译时常量,即我不能在堆栈上分配,但需要malloc选项1.

因此,3个选项可以解释如下:

from libc.stdlib cimport malloc, free
cimport numpy as np
from cython cimport view

np.import_array()

def memview_malloc(int N):
    cdef int * m = <int *>malloc(N * sizeof(int))
    cdef int[::1] b = <int[:N]>m
    free(<void *>m)

def memview_ndarray(int N):
    cdef int[::1] b = np.empty(N, dtype=np.int32)

def memview_cyarray(int N):
    cdef int[::1] b = view.array(shape=(N,), itemsize=sizeof(int), format="i")
Run Code Online (Sandbox Code Playgroud)

让我感到惊讶的是,在所有三种情况下,Cython为内存分配生成了大量代码,特别是调用__Pyx_PyObject_to_MemoryviewSlice_dc_int.这表明(我可能在这里错了,我对Cython内部工作的洞察力非常有限),它首先创建一个Python对象,然后将其"转换"到内存视图中,这似乎是不必要的开销.

一个简单的基准测试并未揭示三种方法之间存在很大差异,其中2是最薄弱的方法.

推荐三种方法中的哪一种?或者有更好的选择吗? …

python memory buffer memory-management cython

65
推荐指数
2
解决办法
1万
查看次数

Python列表到Cython

我想知道如何使用Cython将普通的python列表转换为C列表,处理它并返回一个python列表.喜欢:

Python脚本:

import mymodule

a = [1,2,3,4,5,6]
len = len(a)
print(mymodule.process(a,len))
Run Code Online (Sandbox Code Playgroud)

Cython脚本(mymodule.pyd):

cpdef process(a, int len):
    cdef float y
    for i in range(len):
        y = a[i]
        a[i] = y * 2
    return a
Run Code Online (Sandbox Code Playgroud)

我读到了关于MemoryView和许多其他的东西,但我并不是真的知道发生了什么,很多例子使用Numpy(我不想用它来避免我的脚本用户下载一个大包...反正我觉得它不是'使用我的软件).我需要一个非常简单的例子来了解究竟发生了什么.

python arrays cython

15
推荐指数
1
解决办法
1万
查看次数

标签 统计

cython ×2

python ×2

arrays ×1

buffer ×1

memory ×1

memory-management ×1