gpt4 book ai didi

python - Python 和 C 的单一源文件

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:37 25 4
gpt4 key购买 nike

我正在写一个小模块,它会在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;
}

现在我想知道是否可以更进一步,使用一些更好的模式(例如宏)来定义:

  • 全局(常量)数组和矩阵
  • 简单的控制流程、条件和循环

或其他一些改进。

最佳答案

这个提案的根本问题是在编译 C 的同时解释 Python。

虽然您将 C 源代码通过预处理器传递一次,这是 C 构建工具链的默认行为,但对于 Python,您必须构建一个工具来通过 C 预处理器传递 .py 文件,每次你想运行代码时,然后将输出传递给 Python 解释器。

您的运行时将需要 Python 解释器和您的特殊工具,如果没有这种依赖性,代码将无法再移植到系统。

这是一个不存在的问题的复杂解决方案。

关于python - Python 和 C 的单一源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58040403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com