Cython:如何在不需要 GIL 的情况下从 numpy 内存视图转到矢量[对[双,双]]?
Cython: how to go from numpy memory view to vector[pair[double,double]] without needing the GIL?
我正在尝试将Cython代码中的所有Python调用转换为纯C,以便能够释放GIL并进行并行化。
我曾经使用从 2D numpy 数组初始化的大小 2 列表列表,所以我做了类似的事情:
cdef double[:,:,:] init=np.random.uniform((10,4,2),dtype=np.float32)
cdef int i
cdef int N=init.shape[0]
for i in range(N):
a=init[i].tolist()
#I then get this list of list
#a=[[1.,1.],[1.,1.],[1.,1.]]
#f acting on list of list
f(a)
我需要在循环中释放 GIL,所以我需要删除对 Python 的所有调用。通过使用向量[对[双精度,双倍]]而不是列表并相应地修改f,我现在有:
cdef vector[pair[double,double]] a
cdef double[:,:,:] init=np.ones((10,4,2),dtype=np.float32_t)
cdef int i
cdef int N=init.shape[0]
for i in prange(N):
#I need to get a vector[pair[double,double]] from the numpy init[i]
#with f now cdef acting on vector[pair[double,double]]
a=np.asarray(init[i]) #actually works but it goes through Python !
f(a)
如何在不通过python的情况下将init[i](因此是double[:,:]类型(转换为向量[pair[double,double]]?
我认为没有任何解决方案可以在不使用 GIL 的情况下从 memoryview 甚至 numpy 转到std::vector
。我找到的唯一解决方案是首先将大数组转换为vector[vector[pair[double,double]]]
,然后您可以在没有 GIL 的情况下访问它,在一秒钟内进行所有密集计算。
相关文章:
- 将字符串存储在c++中的稳定内存中
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 视图中的参数推导失败:take_while
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 带有 GDB 调试器的 VS 代码内存视图
- Cython:如何在不需要 GIL 的情况下从 numpy 内存视图转到矢量[对[双,双]]?
- 如何在没有动态内存分配(堆)的情况下为可变大小数组(矢量)定义安全容器或视图
- 如何通过文件映射对象重新映射共享内存的视图?
- 从eigen :: vectorxd获取矩阵视图/块而无需复制(共享内存)
- 在Cython中封装std::数组,并将其暴露给内存视图
- 释放内存映射文件后取消映射视图是否安全
- 内存映射文件,保护单个视图不被覆盖
- 使用自定义视图的ICS中位图分配的可用内存