gpt4 book ai didi

arrays - Cython 多处理共享内存

转载 作者:行者123 更新时间:2023-12-05 07:54:02 32 4
gpt4 key购买 nike

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

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

数据.pxd:

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

数据.pyx:

    cdef class Data:
def __init__(self):
pass

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

主文件.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: Cannot convert c_double_Array_1500 to numpy.ndarray

我试图将 my_data 声明为一个 cpython 数组,但这给出了相同的 TypeError。有没有办法在 Data.pxd 中声明 my_data 以便它可以与多进程共享?

最佳答案

您遇到的问题是 multiprocessing.Array 不是一个 numpy 数组,而是一个“ctypes 数组”(根据 the multiprocessing documentation)。

使其工作的最简单方法是使用 Cython typed memoryview特性,它接受任何具有数组接口(interface)的东西:

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

当我进行此更改时,您的程序可以正常工作,并且也可以很好地处理 numpy 数组、python 数组以及您尝试向它抛出的大多数其他内容。

请注意,此版本中不灵活的一件事是该数组是您未指定的 double 组。如果您需要在此处接受任何数据类型(而不仅仅是 double 据类型),您可能无法使用 cdef 类型轻松完成。

关于arrays - Cython 多处理共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31954459/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com