diff --git a/paddle/pybind/pybind.cc b/paddle/pybind/pybind.cc index a6b583821f261a9848153e7ba99295ec2dce106e..74f590403402c930d532be6c0b9fc4b24ca6c42c 100644 --- a/paddle/pybind/pybind.cc +++ b/paddle/pybind/pybind.cc @@ -53,6 +53,25 @@ bool IsCompileGPU() { #endif } +template +inline std::vector RepeatedToVector( + const google::protobuf::RepeatedField &repeated_field) { + std::vector ret; + ret.reserve(repeated_field.size()); + std::copy( + repeated_field.begin(), repeated_field.end(), std::back_inserter(ret)); + return ret; +} + +template +inline void VectorToRepeated(const std::vector &vec, + RepeatedField *repeated_field) { + repeated_field->Reserve(vec.size()); + for (auto &elem : vec) { + *repeated_field->Add() = elem; + } +} + PYBIND11_PLUGIN(core) { py::module m("core", "C++ core of PaddlePaddle"); @@ -377,11 +396,7 @@ All parameter, weight, gradient are variables in Paddle. const std::string ¶meter, const std::vector &arguments) { var->set_parameter(parameter); - auto args = var->mutable_arguments(); - args->Reserve(static_cast(arguments.size())); - for (auto &arg : arguments) { - *args->Add() = arg; - } + VectorToRepeated(arguments, var->mutable_arguments()); }; auto op_desc_set_attr = [](OpDesc &desc, const std::string &name) {