Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用C绑定导入代码的Pickle模块_Python_Cython_Pickle - Fatal编程技术网

Python 使用C绑定导入代码的Pickle模块

Python 使用C绑定导入代码的Pickle模块,python,cython,pickle,Python,Cython,Pickle,我有一个类要使用此函数进行pickle: def_pickle(自): “”“Pickle模型实例。”。 """ fpath=f'{directory}/model.pickle' 将open(fpath,'wb')作为f: pickle.dump(self、f、pickle.HIGHEST_协议) 但是,在我的文件中,我导入了一个库。它是一些C代码的Python包装器,可以从Polya gamma发行版进行快速采样。当我尝试pickle类时,会出现以下错误: 回溯(最近一次呼叫最后一次):

我有一个类要使用此函数进行pickle:

def_pickle(自):
“”“Pickle模型实例。”。
"""
fpath=f'{directory}/model.pickle'
将open(fpath,'wb')作为f:
pickle.dump(self、f、pickle.HIGHEST_协议)
但是,在我的文件中,我导入了一个库。它是一些C代码的Python包装器,可以从Polya gamma发行版进行快速采样。当我尝试pickle类时,会出现以下错误:

回溯(最近一次呼叫最后一次):
文件“fit_model.py”,第262行,在
模型拟合(Y)
文件“/Users/gwg/projects/cdnlvm/kl_gplvmbase.py”,第97行,适合
自绘制和打印(t)
文件“/Users/gwg/projects/cdnlvm/kl_nbgplvm.py”,第456行,在绘图和打印中
赛尔夫
文件“/Users/gwg/projects/cdnlvm/kl_gplvmbase.py”,第352行,在pickle中
pickle.dump(self\uf,pickle.HIGHEST\u协议)
文件“stringsource”,第2行,pypolyagamma.pypolyagamma.pypolyagamma.\uuu reduce\uCython__
TypeError:由于非平凡的cinit,没有默认值__
我的理解是,Python不知道如何序列化PyGamma代码,可能是因为对C的依赖性。正确的处理方法是什么


如果您愿意安装PyGamma,下面是一个简单而完整的示例:

#pickle_test.py
进口泡菜
从pypolyagamma导入pypolyagamma
类别模型:
定义初始化(自):
self.pg=pygamma()
模型=模型()
将open('test.pickle','wb+')作为f:
pickle.dump(型号f)
这将输出:

回溯(最近一次呼叫最后一次):
文件“pickle_test.py”,第15行,在
pickle.dump(型号f)
文件“stringsource”,第2行,pypolyagamma.pypolyagamma.pypolyagamma.\uuu reduce\uCython__
TypeError:由于非平凡的cinit,没有默认值__

不幸的是,您使用的PyGamma库目前不支持对这些对象进行pickle/unpickle处理,因此一句话:如果不修改库,就无法对它们进行pickle处理


此外,由于它封装了C++类,所以不需要小工具。它需要知道对象在取消勾选后处于相同状态所需的状态。作为包装器的替代方案,如果您不介意使用函数接口,那么我建议使用。这就解决了酸洗的问题。它是一个用C编写的用于Polya Gamma变量采样的python包。它非常灵活,允许使用不同的采样方法,并且有一个类似Numpy的API。您可以通过

pip install-U

安装最新版本,我想可能就是这样。我愿意努力修改这个库(可能还会修改它),因为它最终对我很重要,我需要它来实现并行化。你知道怎么做的基本要点吗?取消勾选所需的仅有两个属性是两个整数,
seed
trunc
。其他一切都是无状态的。如果你认为这是一个单独的问题,你可以认为这是有必要的。如果这些是唯一需要的东西,那么在你自己的Python类中只需包装一个C++类就可以了。(并从C++代码中的那些整数中重建C++对象