我在c++类中有一个function(func),想从python端调用它,以尽可能短的延迟调用以下序列:
1_在python端:func(np.array([1,2,3,4,5])或func([1,2,3,4,5])或2D数组,以及您可能会想得到的其他建议潜伏。
2_在c++方面:我有一个franka::RobotState robot_state_类型的占位符,我想在其中复制上面数组的一部分。我可能会做的事情例如:
for (int i = 0; i < 7; ++i) {
robot_state_.q [i] = array_that_came_from_python_side [i];
robot_state_.dq [i] = array_that_came_from_python_side [i+7];
robot_state_.tau_J [i] = array_that_came_from_python_side [i+14];
}
3_然后我已经写的下一行将更新另一个franka::Torques _eff_cmd类型的占位符,我想返回到python端并想象这样做,如下所示:
for (int i = 0; i < 7; ++i) {
array_to_return[i] = _eff_cmd[i]
}
return array_to_return // to be sent to the python side
其中array_to_return可以在python端以任何类型返回,例如numpy array或list或任何其他建议(例如输入)。然后我将在python端以较高的频率重复此序列,因为它基本上是关于控制反馈循环的。
我的问题是如何使用Cython以最快的方式执行此操作,如何在c++端定义func。遵循this thread之后,提供一种较低延迟的一种可能方法似乎是Memoryviews,但到目前为止,我仍然不太了解我最好用c++代码和Cython pyx文件编写的内容。如果有人可以指导我,如果您对延迟时间更短,除了memoryviews之外,您还有其他建议,我将不胜感激。
最佳答案
当涉及性能优化时,您必须衡量!
首先,请确保您确切知道热点在哪里。您可以使用perf
或Intels vTune
来确保优化正确的位置。
比您可以为该特定热点编写google benchmark
测试。
如果该片段是您的热点,则拆分循环将对您有所帮助,因为您具有连续的内存访问权限。
for (int i = 0; i < 7; ++i) {
robot_state_.q [i] = array_that_came_from_python_side [i+7];
}
for (int i = 0; i < 7; ++i) {
robot_state_.dq [i] = array_that_came_from_python_side [i+7];
}
for (int i = 0; i < 7; ++i) {
robot_state_.tau_J [i] = array_that_came_from_python_side [i+14];
}
否则它可能无能为力,因为这些天编译器非常聪明。
也许
std::memcopy
会做得很好std::memcpy(robot_state_.q, &array_that_came_from_python_side[0], 7);
std::memcpy(robot_state_.dq, &array_that_came_from_python_side[7], 7);
std::memcpy(robot_state_.tau_J , &array_that_came_from_python_side[14], 7);
关于python - Cython为高频控制环路传递浮点数的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62423017/