我有一个使用memoryview数组的cython模块,就是......
double[:,:] foo
我想使用多处理并行运行此模块。但是我得到了错误:
PicklingError: Can't pickle <type 'tile_class._memoryviewslice'>: attribute lookup tile_class._memoryviewslice failed
为什么我不能挑选内存视图,我该怎么办呢。
答案 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实例所需的内容,在本例中为保存矩阵)和包含恢复实例所需的所有值的字典。