python - 即使使用最高协议,腌制 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 倍。有没有办法来解决这个问题?
谢谢
解决方案
推荐阅读
- excel - Excel - 如何使用一张工作表中的单元格值转到同一工作簿中另一张工作表上的另一个值
- php - URL 查询字符串可以包含句点吗?
- python - Pandas 导入错误:缺少“pytz”。但在控制台中工作正常
- excel - Excel - 查找所有数字并放入单列
- c# - Unity C#中“缺少引用异常”和“空引用异常”的区别
- python - Pandas groupy:检索数据分组的列
- java - 如何在 Java 字符串中插入表情符号?
- python - 如何在 django 中创建唯一的 URL?
- terraform - 排除 Terraform 模块中的资源
- bash - 无法将 bash 输出写入文件