使用Python语法子集加速C程序编写
我一直在努力优化我的时间。写C语言代码需要花费很多时间,而且比起写Python程序来说,敲键盘的次数要多得多。
不过,为了加快写C程序的速度,我们可以自动化很多事情。我希望能用类似Python的方式来写程序,但语法还是C语言的。这意味着所有的关键字都是C语言的关键字,但语法经过优化。
比如,这段C代码:
#include "dsplib.h"
#include "coeffs.h"
#define MODULENAME "dsplib"
#define NUM_SAMPLES 320
typedef float t_Vec;
typedef struct s_Inter
{
char *pc_Name;
struct s_Inter *px_Next;
}t_Inter;
typedef struct s_DspLibControl
{
t_Vec f_Y;
}t_DspLibControl;
void v_DspLibName(void)
{
printf("Module: %s", MODULENAME); printf("\n");
}
int v_DspLibInitInterControl(t_DspLibControl *px_Con)
{
int y;
px_Con->f_Y = 0.0;
for(int i=0;i<10;i++)
{
y += i * i;
}
return y;
}
在优化后的Python风格版本中可以看成:
include dsplib, coeffs
define MODULENAME="dsplib", NUM_SAMPLES=320
typedef float t_Vec
typedef struct s_Inter:
char *pc_Name
struct s_Inter *px_Next
t_Inter
typedef struct s_DspLibControl:
t_Vec f_Y
t_DspLibControl
v_DspLibName():
printf("Module: %s", MODULENAME); printf("\n")
int v_DspLibInitInterControl(t_DspLibControl *px_Con):
int y
px_Con->f_Y = 0.0
for int i=0;i<10;i++:
y += i * i
return y
我的问题是:你知道有没有VIM脚本,可以把原本用Python风格写的C代码转换成标准的C代码吗?比如说,有人写C代码时使用了Python风格的语法,一旦她决定要把这些Python风格的代码块转换成标准C代码,她只需要选择这些代码块,然后按一个键。她当然不需要保存这些Python风格的代码,VIM就会把它们转换成标准的C代码。
9 个回答
你有没有仔细想过自己花时间在什么地方——你真的想为了省几个按键的时间而牺牲代码的可维护性吗?
当我写代码的时候,我大部分时间是在阅读代码。
也许你只是一个打字速度非常慢的人... ;-)
我写了一个小的Python脚本,让我可以用Python的语法来写C语言,像这样:
void quicksort(int* lst, int left, int right):
int i, j, p, tmp
i = left
j = right
p = lst[(i + j) / 2]
while i <= j:
while lst[i] < p: i++
while lst[j] > p: j--
if i <= j:
tmp = lst[i]
lst[i] = lst[j]
lst[j] = tmp
i++
j--
if left < j: quicksort(lst, left, j)
if i < right: quicksort(lst, i, right)
这个脚本非常简单,它会逐行检查一些特定的格式,然后调整缩进,最终生成标准的C代码。效果很好,我觉得这样看起来比到处都是分号和大括号要好很多。我不明白为什么有些人对这个主意这么反感。你们觉得怎么样?
Cython 是用来写 Python 扩展的,不是用来写完整程序的。Pyrex 也是这样。
虽然和你的例子有点不同,但 PyPy 可能是你想要的。它使用一种叫 RPython 的 Python 子集(这是一种更静态的 Python)来生成代码,可以支持不同的后端,包括 C。虽然它可能无法让你对数据结构进行非常细致的控制,但可以试试看。
你所需要的其实是一种不同且相对简单的 C 语言方言——虽然这本身并不是个坏主意,但世界上已经有很多不同的编程语言了,如果每个人都为每个应用发明一种新的方言,那就会很麻烦。
如果你觉得 C 语言太啰嗦或者太底层,试试这个方法:
- 先用 Python 写你的程序
- 分析一下,找出哪些部分真的需要加速
- 把这些部分放在明确的模块里
- 用 Pyrex 或 Cython 重写这些部分
这样你可能会得到很好的可读性、可维护性和速度。