今天我的一个好朋友问我最新的 Go 语言和Cython之间的主要区别是什么,Cython是 Python 的一组 C 扩展。我对 Python 知之甚少,谁能告诉我为什么 Go 比 Cython 更好/更差?
6 回答
Cython 并不是传统意义上的真正语言。它是一个用于构建 Python 扩展的预处理器,它采用类似 Python 的语法(实际上它们力求完全兼容 Python)并生成 C 代码(使用 Python C API)。这样做他们能够包含一些特殊情况的优化,但真正的好处是当您将 Cython 特定的静态类型信息添加到 C 代码中时,绕过这些操作的 Python 运行时并导致高速运行。
Go 是一种编译型编程语言。在 Go 中可以做的第一件事是生成一个不包含 Python 运行时的可执行文件/启动 Python 解释器——这在 Cython 中是不可能的。(在技术上可能并非不可能 - 但如果您不使用 Python,那么使用 Cython 确实没有意义)。由于 Cython 仅生成 C,因此您在评论中的大多数问题并不真正适用 - 您可以使用任何 C 调试器(尽管这是 Python 扩展的事实使事情变得更加复杂)。
gevent 是一个以 Cython 为核心的并发库。它似乎相当快: http: //nichol.as/asynchronous-servers-in-python
差异?几乎所有东西!
- 并发和通道。
- 接口。
- 静态类型检查。
- ...
支持呢。您依赖于 Google 提供的单一编译器。如果 Go 折叠或商业化怎么办?
使用 Cython,如果 Cython 项目折叠,您总是可以回到 Python(或移植 C 代码)。
更新:我必须说我现在对 Cython 很不高兴。 缺乏线程支持是一个重大打击。Cython 是线程安全的,但代价高昂。全局解释器锁在函数执行的整个过程中都被持有。从而禁用整个代码库的并发执行!
Cython 的 C 类功能文档很少,新手会感到困惑。我承认。
Cython 的目的是支持 Sage 数学软件;Go 的目的是支持谷歌雄心勃勃的尖端昂贵硬件计划。
简而言之,我不再喜欢这两种语言中的任何一种。回到 C++(再次)。我最喜欢的是Cython。
GO 引入了 goroutine 和通道。查看语言常见问题
我尝试 Go 的主要原因是在程序中引入并发性的假设很容易。我认为这将是“下一件大事”,因为处理器速度将会下降,并且越来越多的内核可用。如果您想使用多核处理器,您需要编写程序以便它可以同时运行。
我之前看过 Erlang,但尽管习惯了 Prolog,但我还是觉得它有点奇怪;它与您的“普通”编程语言(C 或 Pascal 家族的)如此不同。但是一旦你掌握了它的窍门,它的并发特性就很容易使用。只需很少的努力,我就能够编写一个并行解析器,它不使用堆栈,但每次有多个选项时都会产生一个新的“线程/进程”。
到目前为止,go 看起来还不错,尽管有一些细微的不一致。而且它也很快,这是一个奖励。
因此,除非 Cython 也使并发变得容易,否则我宁愿去......