我想构建一个具有可变数量的内存视图的 cython 类。我希望能够在不复制大量数据的情况下对内存视图进行洗牌并重新排序。我想保留在编译类型时确定数组的基本类型(双精度)的好处。
到目前为止,我还没有设法有效地做到这一点。
这是基线类定义:
import numpy as np
cimport numpy as np
cdef class Container:
cdef double[:] ary
def __cinit__(self, long n):
self.ary = np.zeros(n, dtype = np.float)
cpdef void fill(self, double v):
cdef long i
for i in range(len(self.ary)):
self.ary[i] = i+v
当我按如下方式运行速度基准测试时:
a = Container(1000)
%timeit a.fill(10)
我每次运行 550 ns fill
。
现在我想在我的班级中有几个内存视图,所以我尝试了:
import numpy as np
cimport numpy as np
cdef class Container2:
cdef object[:] ary
def __cinit__(self, long n, long m):
cdef Py_ssize_t i
self.ary = np.empty(n, dtype = np.object)
for i in range(n):
self.ary[i] = np.zeros(m, dtype=np.float)
cpdef void fill(self, double v):
cdef long i, j
cdef double[:] sl
for i in range(len(self.ary)):
sl= self.ary[i]
for j in range(len(self.ary[i])):
sl[j] = j+v
Container2
与 相同Container
,只是它拥有可变数量的类型化内存视图,而不仅仅是一个。
当我再次使用运行速度基准测试时
b = Container2(10, 1000)
%timeit b.fill(10)
我现在每次运行得到 9.5 µs,因此与上面的比较,这意味着在一个大小为 1000 的阵列上每次运行需要 950 ns。
所以处理时间增加了一倍。
当然,必须有更好、更有效的方法。