首页 文章

使用Cython多处理共享内存

提问于
浏览
2

我试图用Cython和多处理包在共享内存中定义一个数组 . 但是,我无法在.pxd文件中声明此数组 .

简单的测试代码如下 . 我有一个带有变量my_data的Cython类数据 . 这个变量my_data将是共享数组 .

Data.pxd:

cimport numpy as np
    cdef class Data:
        cdef public np.ndarray my_data

Data.pyx:

cdef class Data:
        def __init__(self):
            pass

然后,我在主文件中声明共享数组:

main_file.py:

# -*- coding: utf-8 -*-
    import pyximport; 
    import numpy as np
    from multiprocessing import Array
    pyximport.install(setup_args={"include_dirs":np.get_include()},)

    from Data import *

    ### Create Data
    N  = 1500
    dc = Data()
    dc.my_data  = Array('d', N, lock=False)

运行main_file.py会给出TypeError:

TypeError: Cannot convert c_double_Array_1500 to numpy.ndarray

我试图将my_data声明为cpython数组,但是它给出了相同的TypeError . 有没有办法在Data.pxd中声明my_data,以便可以与多处理器共享?

1 回答

  • 0

    你遇到的问题是 multiprocessing.Array 不是一个numpy数组,而是一个"ctypes array"(根据the multiprocessing documentation) .

    使其工作的最简单方法是使用Cython typed memoryview功能,它接受任何具有数组接口的功能:

    # Data.pxd
    cdef class Data:
        cdef public double[:] my_data
    

    当我进行此更改时,您的程序运行正常,并且还可以使用numpy数组,python数组以及您尝试抛出的大多数其他内容 .

    请注意,此版本中不灵活的一件事是该数组是一个双精度数组,您没有指定 . 如果你需要在这里接受任何数据类型(而不仅仅是双打),你很可能不能轻易地使用cdef类型 .

相关问题