Я пишу небольшой модуль, который будет использоваться как в Python, так и в C. Я могу написать версию Python и версию C, или я могу скомпилировать версию C и затем интегрировать в Python.Но так как модуль в основном состоит из математических вычислений, которые в основном одинаковы в Python и C, я рассматриваю возможность написания одного файла, который можно импортировать как в Python, так и компилировать как исходный код C.
Вот основной прием:
#if 1 /*
write Python code here
''' */
write C code here
#endif // '''
Таким образом, интерпретатор Python будет игнорировать часть C, а компилятор C будет игнорировать часть Python.
Например, следующее foo.py
:
#if 1 /*
from math import sin, cos, sqrt
''' */
#include <math.h>
#endif // '''
#if 1 /*
def rotation(axis, angle):
matrix = [0.] * 9
''' */
void rotation(double *axis, double angle, double *matrix) {
double sa, ca, ia, r, x, y, z, xx, yy, zz;
double cayz, caxz, caxy, iayz, iaxy, iaxz, sax, say, saz;
#endif // '''
sa = sin(angle);
ca = cos(angle);
ia = 1. - ca;
r = sqrt(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
x = axis[0] / r;
y = axis[1] / r;
z = axis[2] / r;
xx = x * x;
yy = y * y;
zz = z * z;
cayz = ca * (yy + zz);
caxz = ca * (xx + zz);
caxy = ca * (xx + yy);
iayz = ia * y * z;
iaxz = ia * x * z;
iaxy = ia * x * y;
sax = sa * x;
say = sa * y;
saz = sa * z;
matrix[0] = cayz + xx;
matrix[1] = iaxy - saz;
matrix[2] = iaxz + say;
matrix[3] = iaxy + saz;
matrix[4] = caxz + yy;
matrix[5] = iayz - sax;
matrix[6] = iaxz - say;
matrix[7] = iayz + sax;
matrix[8] = caxy + zz;
#if 1 /*
return matrix
''' */
}
#endif // '''
В Python:
from foo import rotation
print(rotation([1., 2., 3.], 4.))
В C:
#include "foo.py"
int main() {
double axis[3] = {1., 2., 3.};
double angle = 4.;
double matrix[9];
rotation(axis, angle, matrix);
printf("[%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf]",
matrix[0], matrix[1], matrix[2],
matrix[3], matrix[4], matrix[5],
matrix[6], matrix[7], matrix[8]);
return 0;
}
Теперь мне интересно, могу ли я пойти немного дальше, чтобы использовать некоторые более лучшие шаблоны, такие как макросы,определить:
- глобальные (постоянные) массивы и матрицы
- простой поток управления, условия и циклы
или некоторые другие улучшения.