У меня есть код C ++, который я хотел бы запустить в коде python. Numpy массивы создаются в этом python сценарии, а затем отправляются в dll через ctypes
.
TheDLL. cpp
extern "C" __declspec(dllexport) void DoSomeStuff(int *Array_A, int *Array_B, int *Array_C) {
//Do stuff here
}
TheSimulation.py
mydll = ctypes.CDLL("TheDLL.dll")
mydll.DoSomeStuff.argtypes = [ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)]
Array_A = NumpyArrayA.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
Array_B = NumpyArrayB.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
Array_C = NumpyArrayC.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
mydll.DoSomeStuff(Array_A, Array_B, Array_C)
Array_A
, Array_B
и Array_C
имеют измененные значения, и сценарий python продолжается
Вышеприведенное делает именно то, что мне нужно, однако я заметил, что DoSomeStuff
работает очень медленно в отличие от того, если он был скомпилирован как Exe и работает сам по себе (примерно в 15 раз медленнее). Я попытался скомпилировать cpp в обычный EXE-файл и вызвать его через subprocess
в python.
TheEXE. cpp
void DoSomeStuff(int *Array_A, int *Array_B, int *Array_C) {
//Do stuff here
}
int main () {
//Load Array_A, Array_B, Array_C from external files, separate from the python script entirely
DoSomeStuff(Array_A, Array_B, Array_C);
}
И python сейчас
TheSimulation.py
from subprocess import call
call(["TheEXE.exe"])
С точки зрения скорости метод subprocess
дает желаемые результаты, но я не уверен, как я могу вставить эти указатели массива в TheEXE. exe-процесс так же, как я делал с этими ctypes
указателями массива в DLL. Можно ли как-то повторить то, что я сделал с ctypes
и DLL через subprocess
и EXE?
Заранее всем спасибо и наилучшими пожеланиями,