В настоящее время я нахожусь в процессе перемещения узкого места производительности в моем коде python в c, чтобы исследовать эффекты производительности. Этот код запустит симуляцию и сообщит результаты в python через ctypes. Однако у меня возникают проблемы с корректным совпадением типов.
Несмотря на то, что я пытаюсь решить эту конкретную проблему, я также ищу более общие рекомендации по работе с ctypes, так как документация и процедура кажутся немного тонкими.
У меня есть следующая функция c:
extern "C" {
void f( int* array, int arraylen ) {
for(int i = 0; i < arraylen; i++) {
array[i] = g() // mutate the value array[i];
}
}
}
И следующий код на python:
import ctypes
plib = ctypes.cdll.LoadLibrary('./mylib.so')
_f = plib.f
_f.restype = None
_f.argtypes = [ ctypes.POINTER(ctypes.c_int), ctypes.c_int ]
seqlen = 50
buffer = ctypes.c_int * seqlen
_f( buffer, seqlen )
Однако этот фрагмент умирает со следующей трассировкой:
Traceback (most recent call last):
File "particle.py", line 9, in <module>
_f( buffer, seqlen )
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_c_int instance instead of _ctypes.ArrayType