首页 > 解决方案 > 即使使用最高协议,腌制 C++ 对象时腌制也很慢

问题描述

我有 3 个进程,每个进程都会创建一个大对象,大约需要 6 秒。但是,当使用 getstate 和 setstate 时,复制它们需要 60 多秒。有没有办法让酸洗更快?这些对象是从带有 boost/python 的 C++ 扩展继承的 python 类。我已经尝试使用这里帖子中建议的最高协议,因为显然 dill 比 pickle 更快,部分原因是它使用了最高协议(来自这篇文章),但它没有任何区别。

这是代码的基本结构,对双端队列和向量的pickle支持在另一个文件中实现,并且基于这篇文章

C++ 基类:

class Base{
public:
    Base(int a, boost::python::object o);
    // attributes
    vector<Info*>* infos;
    deque<Foo*>* foos;
    int a;
    boost::python::object o;
    // functions
};
Base::Base(int a, boost::python::object o)){
    // assign args
    this->a = a;
    this->o = o;
    for(int i = 0; i < 50; i++){
        this->infos->push_back(new Info(i,i));
    }
}
struct base_picke_suite : boost::python::pickle_suite {
    static boost::python::tuple getinitargs(Base const& base){
        return boost::python::make_tuple(base.a, base.o);
    }
    static boost::python::tuple getstate(boost::python::object obj){
        const Base& base = boost::python::extract<Base&>(obj)();
        return boost::python::make_tuple(base.infos, base.foos, obj.attr("__dict__");
    }
    void setstate(boost::python::object obj, boost::python::tuple state){
        Base& base = boost::python::extract<Base&>(obj)();
        base.infos = state[0];
        base.foos = state[1];
        boost::python::dict d = extract<dict>(obj.attr("__dict__"));
        d.update(state[2]);
    }
    static bool getstate_manages_dict() { return true; }
};

在 python 类中:

from Base import *
class Derived(Base):
    def __init__(self, a, o):
        super().__init__(a, o)
        self.i = 1
        self.j = 2
    def __getinitargs__(self):
        return (self.a, self.o)
    def __getstate__(self):
        return (self.infos, self.foos, self.i, self.j, self.__dict__)
    def __setstate__(self, state):
        self.infos = state[0]
        self.foos = state[1]
        self.i = state[2]
        self.j = state[3]
        self.__dict__.update(state[4])
    __getstate_manages_dict__ = True

虽然一切都可以编译和运行,但选择速度比原生 python 代码慢 2 倍。有没有办法来解决这个问题?

谢谢

标签: pythonc++serializationboostmultiprocessing

解决方案


推荐阅读