4

我使用 pickle 和 dill 来跟随 lambda 函数并且工作正常:

import dill
import pickle

f = lambda x,y: x+y
s = pickle.dumps(f)

甚至在课堂上使用时,例如:

文件

foo.py

class Foo(object):
    def __init__(self):
        self.f = lambda x, y: x+y 

文件

测试.py

import dill
import pickle
from foo import Foo

f = Foo()
s = pickle.dumps(f)  # or  s = dill.dumps(f)

但是当使用 cython 构建格式为 .pyx (foo.pyx) 的相同文件时,无法使用 dill、pickle 或 cpickle 进行序列化,出现此错误:

不能腌制。在 0x7f9ab1ff07d0>:找不到 foo.lambda

用于构建 cython 的 setup.py 文件

安装程序.py

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize("foo.pyx"))

然后在终端中运行:

python setup.py build_ext --inplace

有办法吗?

4

2 回答 2

2

我是dill作者。扩展@DavidW 在评论中所说的内容——我相信(目前)没有已知的序列化程序可以腌制 cython lambdas 或绝大多数 cython 代码。事实上,python 序列化程序要使用 C 扩展来腌制对象要困难得多,除非 C 扩展代码的作者专门构建序列化指令(如numpypandas)。在那种情况下......而不是lambda,你可以用一个__call__方法构建一个类,所以它就像一个函数......然后添加一个或多个泡菜方法(__reduce__,,,__getstate____setstate__,或类似的东西)......然后你应该能够腌制你的类的实例。这有点工作,但由于这条路径已用于腌制用 C++ 编写的类——我相信你应该能够让它为 cython 构建的类工作。

于 2020-04-13T12:32:40.340 回答
0

在这段代码中

import dill
import pickle

f = lambda x,y: x+y
s = pickle.dumps(f)

f是一个函数,但在另一个代码中

import dill
import pickle
from foo import Foo

f = Foo()
s = pickle.dumps(f)  
# or  
s = dill.dumps(f)

f是一个类

于 2020-04-10T11:02:58.097 回答