我在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/

10-10 03:31
查看更多