为什么不能腌制cython内存视图?

时间:2013-12-18 01:38:18

标签: cython memoryview

我有一个使用memoryview数组的cython模块,就是......

double[:,:] foo

我想使用多处理并行运行此模块。但是我得到了错误:

PicklingError: Can't pickle <type 'tile_class._memoryviewslice'>: attribute lookup tile_class._memoryviewslice failed

为什么我不能挑选内存视图,我该怎么办呢。

1 个答案:

答案 0 :(得分:0)

也许传递实际数组而不是内存视图可以解决您的问题。 如果你想并行执行一个函数,如果我没记错的话,所有参数都必须是可选的。至少python多处理就是这种情况。因此,您可以将数组传递给函数并在函数内创建memoryview。

def some_function(matrix_as_array):
    cdef double[:,:] matrix = matrix_as_array
    ...

我不知道这对你有帮助,但我遇到了类似的问题。我使用memoryview作为cdef类中的属性。我必须编写自己的__reduce____setstate__方法来正确地解开我班级的实例。使用numpy.asarray将内存视图作为数组腌制并在__setstate__中恢复它对我有用。我的代码的简化版本:

import numpy as np

cdef class Foo:
    cdef double[:,:] matrix

    def __init__(self, matrix):
        '''Assign a passed array to the typed memory view.'''
        self.matrix = matrix

    def __reduce__(self):
        '''Define how instances of Foo are pickled.'''
        d=dict()
        d['matrix'] = np.asarray(self.matrix)
        return (Foo, (d['matrix'],), d)

    def __setstate__(self, d):
        '''Define how instances of Foo are restored.'''
        self.matrix = d['matrix']

请注意__reduce__返回一个由可调用的(Foo)组成的元组,该可调用的参数元组(即创建'new'Foo实例所需的内容,在本例中为保存矩阵)和包含恢复实例所需的所有值的字典。