Py学习  »  Python

使用python语法的子集加速编写c程序

psihodelia • 4 年前 • 970 次点击  

我一直在努力优化我的时间。编写c代码比编写python程序要花很多时间,需要更多的键盘操作。

然而,为了加快创建c程序所需的时间,可以将许多事情自动化。我想用smth编写我的程序。像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;
} 

在优化的pythonized版本中可以如下所示:

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脚本,它允许将原始的pythonized c代码转换为标准的c代码吗?例如,一个人正在编写一个c代码,但是使用了pythonized语法,一旦她决定将pythonized块转换为标准c,她就会选择这样的块并按下一些键。当然,她不会保存这种pythonized代码,vim会将其转换为标准c。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43221
 
970 次点击  
文章 [ 9 ]  |  最新文章 4 年前
Caglar Toklu
Reply   •   1 楼
Caglar Toklu    14 年前

如果C++是对的,与Cython和Pyrx不同, Shed Skin 习惯于 转换 Python的一个子集到C++,并用St/G++编译它。“python的子集”意味着您编写的所有代码仍然是python,但是您不能使用python的所有模块(实际上您只能使用其中的一些模块),也不能使用一些过于动态的东西。由于代码转换为C++,用G++编译,这是相当公平的。

例如:

# Actually, in Python, this is one line:
matrix = [[1, 2, 3], [4, 5, 6]]
zipped = zip(*matrix)
# But, Shed Skin has some restrictions for this, so you have:
matrix = [[1, 2, 3], [4, 5, 6]]
zipped = zip(matrix[0], matrix[1])

Shed Skin使用类型推断,所以,

x = 4.0 # OK
x = 5.0 # OK
x = "foo" # OK in Python, but Shed Skin will not compile this

我必须警告你,即使开发是积极的,它仍处于试验阶段。

Michael
Reply   •   2 楼
Michael    14 年前

听起来你需要花些时间来完善C语言中的代码片段、缩写、宏和自动完成的用法。你会通过努力工作和练习来提高速度。

与您的建议最接近的合理类比可能是编写haml来生成html。但这是对声明性语言而不是命令性语言而言的。

alesplin
Reply   •   3 楼
alesplin    14 年前

我已经为各种事情编写了一些vim脚本。我还不得不为一个类从头开始编写词法分析器、解析器和解释器。这是一个 非常 坏主意。

  1. 编写vim脚本将语法转换为c语法并不是一件小事。写过词法分析器吗?解析器?因为这就是你的vim脚本。词法分析器/分析器/编译器/解释器。在vim脚本中这将是一个噩梦。

  2. 它需要一个 长的 编写足够的修改过的语法代码来重新计算编写和测试任何能够进行您所说的翻译的解释器(不仅仅是vim脚本解释器,尽管这可能是一个上限)所需的时间。

  3. 即使你成功地创建了语法解释器,除非你让它在你写了之后用普通的c语法保存文件,否则任何读过该代码的人都会想杀了你。如果你让你的解释器将文件保存在它输出的普通c cyntax中,下次你必须维护/修改文件时,你会直接回到你认为c代码花费了你太多时间来编写的概念。

  4. 如果您想冒险使用vim脚本,您可以编写一些vim脚本或映射/缩写,以使花括号和分号的冗长不那么痛苦。 值得一做。

gnibbler
Reply   •   4 楼
gnibbler    14 年前

Cython 可以帮助你。使用cython的通常方法是通过将模块的一部分编译成c来加快模块的速度。但是,如果您小心的话,完全可以使用cython从pythonlike语法输出纯c文件。

如果您愿意的话,还可以使用python编写unittests。

S.Lott
Reply   •   5 楼
S.Lott    14 年前

如果你想输入更少的C,你不需要语法技巧。

您需要一个更好的、更高级的结构库,这样您实际上键入的c更少,而不是更少的字符来创建伪c。

如果你有一个更好的,更高级的结构库,你可以用一个简短的,易于阅读的语法正确地编写面向对象的程序。

将这一点推向逻辑的极端,您可以创建可以从python调用的漂亮的库包。然后您可以切换到python,输入更少的内容并完成相同的工作量。

AJ.
Reply   •   6 楼
AJ.    14 年前

看看“去”…

http://golang.org/

Alex Brasetvik
Reply   •   7 楼
Alex Brasetvik    14 年前

你分析过你实际花时间在什么上了吗——你真的想用可维护性来换取节省一些按键?

当我写代码时,我花了大部分时间 阅读 代码。

也许你只是 非常 慢速打字机…;-)

Knut Gorlof
Reply   •   8 楼
Knut Gorlof    11 年前

我已经完成了一个小的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代码。 工作得很好,imho的读起来比分号和大括号要好得多。 地点。我不明白你们为什么这么讨厌这个主意。你怎么认为?

Alan Franzoni
Reply   •   9 楼
Alan Franzoni    13 年前

cython旨在编写python扩展,而不是成熟的程序。pyrex也是如此。

尽管这和你的例子很不一样, PyPy 可能是你要找的。它使用一个python子集(称为rpython,一种更为静态的python)来为不同的后端(包括c)生成代码。

你要的是一种不同的、更简单的C语言——虽然这本身并不是一个坏主意,但世界上已经有很多不同的编程语言,如果每个人都为每个应该编写的应用程序发明一种新的方言,那将是一个相当大的问题。

如果您认为c太冗长或太低,无法满足您的需要,请尝试以下方法:

  • 用python编写程序
  • 分析它并找出哪些部件真正需要速度
  • 在定义良好的模块中隔离这些部分
  • 用pyrex或cython重写这些部分

而且您可能会获得很好的可读性、可维护性和速度。