タイム クリティカルなロボット工学アプリケーションのために、ループ内にある関数呼び出しを最適化する必要があります。私のスクリプトは Python で書かれており、ctypes を介して私が書いた C++ ライブラリとやり取りし、マイクロコントローラ ライブラリを呼び出します。
ボトルネックは、位置-速度-時間ポイントをマイクロコントローラーのバッファーに追加することです。私のタイミング チェックによると、ctypes を介した C++ 関数の呼び出しには約0.45
数秒かかり、C++ 側では呼び出された関数に0.17
数秒かかります。どうにかしてこの差を縮める必要があります。
関連する python コードは次のとおりです。データはポイントの 2D 配列であり、ライブラリは ctypes を介してロードされます。
data_np = np.vstack([nodes, positions, velocities, times]).transpose().astype(np.long)
data = ((c_long * 4) * N)()
for i in range(N):
data[i] = (c_long * 4)(*data_np[i])
timer = time()
clibrary.addPvtAll(N, data)
print("clibrary.addPvtAll() call: %f" % (time() - timer))
呼び出された C++ 関数は次のとおりです。
void addPvtAll(int N, long data[][4]) {
clock_t t0, t1;
t0 = clock();
for(int i = 0; i < N; i++) {
unsigned short node = (unsigned short)data[i][0];
long p = data[i][1];
long v = data[i][2];
unsigned char t = (unsigned char)data[i][3];
VCS_AddPvtValueToIpmBuffer(device(node), node, p, v, t, &errorCode);
}
t1 = clock();
printf("addPvtAll() call: %f \n", (double(t1 - t0) / CLOCKS_PER_SEC));
}
ctypes を絶対に使用する必要はありませんが、実行するたびに Python コードをコンパイルする必要はありません。