gpt4 book ai didi

cython - 为什么不能腌制 cython 内存 View ?

转载 作者:行者123 更新时间:2023-12-05 05:27:16 30 4
gpt4 key购买 nike

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

double[:,:] foo

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

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

为什么我不能 pickle 内存 View ,我该怎么做。

最佳答案

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

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

不知道对你有没有帮助,我也遇到过类似的问题。我使用 memoryview 作为 cdef 类中的属性。我不得不自己写 __reduce____setstate__正确解开我类(class)实例的方法。通过使用 numpy.asarray 将内存 View 腌制为数组并在 __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 所需的参数)实例,在本例中为保存的矩阵)和包含恢复实例所需的所有值的字典。

关于cython - 为什么不能腌制 cython 内存 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20648167/

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