2009-11-16 168 views
6

今天我的一个好朋友问我最新的Go语言和Cython之间的主要区别是什么,它是Python的一组C语言扩展。我对Python没有太多的知识,谁能告诉我为什么Go比Cython好?Go和Cython之间的差异

+6

什么是您决定更好还是更坏的标准?这是两种完全不同的编程语言;有很多不同之处,所以这取决于你在找什么。 – 2009-11-16 17:21:35

+0

实际上,我只想知道为什么有人应该使用Go来代替使用Cython,例如,可以在Go中完成哪些使用Cython无法轻松实现的功能?哪些语言有更好的性能?更安全?更好的用户友好性?更好的调试器?或者它与语法只有轻微的不同? – 2009-11-16 17:42:10

+0

在Cython中缺乏任何合理的线程支持已经杀死了我对这种语言的热爱。 'cython nogil' – unixman83 2010-12-14 23:31:02

回答

9

用Cython是不是真正传统意义上的语言。它是一个构建Python扩展的预处理器,它采用类似Python的语法(实际上它们力求完全兼容Python)并生成C代码(使用Python C API)。这样做,他们可以包括一些特殊情况优化,但是当您添加并入C代码中的Cython特定静态类型信息时,会带来真正的好处,绕过这些操作的Python运行时间并导致高速加速。

Go是一种编译的编程语言。在Go中可以做的第一件事就是生成一个不包含Python运行时的可执行文件/启动一个Python解释器 - 这在Cython中是不可能的。 (在技术上可能不是不可能 - 但如果你不使用Python,那么使用Cython确实没有意义)。由于Cython只生成C,所以在注释中大部分问题并不适用 - 您可以使用任何C调试器(尽管这是Python扩展的事实使事情变得更加复杂)。

+3

关于Cython:我不同意。你需要保持你在C中工作的思想,而不是Python。编写存根加载器并不像Python是开源的那么困难。 – unixman83 2010-12-14 09:46:44

4

差异?几乎所有的东西!

  • 并发性和通道。
  • 接口。
  • 静态类型检测。
  • ...
+4

Ugh cython拥有所有这些加上2个相当成熟和强大的语言。 – 2011-09-19 07:21:36

+1

我上次检查时,Cython不支持线程。用于*易于使用的* 1 * – unixman83 2011-09-20 15:16:12

1

我对试图出去,主要原因是应该轻松引入到并发程序。我认为这将是'下一件大事',因为处理器速度将会缩短,并且越来越多的核心可用。如果你想使用多核处理器,你需要编写你的程序,以便它可以同时运行。

我早些时候看过Erlang,但尽管习惯了Prolog,我仍然觉得它有点奇怪;它与你的'平均'编程语言(C或Pascal系列)是完全不同的。但是一旦你掌握了它的并发特性,就很容易使用。只需很少的努力,我就可以编写并行解析器,它不使用堆栈,但每次有多个选项时都会生成一个新的“线程/进程”。

尽管存在一些轻微的不一致,但到目前为止看起来还是挺好的。它也很快,这是一个奖金。

所以,除非用Cython也使得并发容易,我会倾向于去...

+0

*。至少30年来,各种形式的并发一直是“下一件大事”;但要“引入并发”,必须重新思考,并非易事。 – denis 2010-11-25 16:19:09

+1

Cython不支持并发** **(大部分时间都是GIL)。是的,你可以使用多个*进程*,但这是一个操作系统级别的并发性,在Windows下很慢。 – unixman83 2011-09-20 15:10:24

5

gevent是一个以Cython为核心的并发库。这似乎是相当快:http://nichol.as/asynchronous-servers-in-python

+0

我很后悔投了这个...... – unixman83 2011-09-20 15:12:01

+0

你为什么后悔? – 2011-09-22 20:47:39

+0

人们似乎认为python(Cython)可以很好地扩展,直到我学会了内部构件之前,我才成为其中的一员。查找Global Interpreter Lock或GIL,看看我在说什么。总之,没有真正的线程支持。 – unixman83 2011-09-23 02:14:24

2

支持。您依赖于Google提供的单个编译器。如果去折叠或去商业怎么办?

使用Cython,如果Cython项目折叠,您可以随时回到Python(或移植C代码)。

更新:我必须说我现在对Cython感到不满。缺少线程支持是一个重大打击。 Cython是线程安全的,但成本很高。全局解释器锁是一个函数执行的全部时间。从而禁用整个代码库的并发执行!

Cython的类C功能很少记录在案,并且让新手感到困惑。我承认。

Cython的目的是支持Sage数学软件; Go的目标是支持Google雄心勃勃的高端昂贵硬件计划。

总之,我不再喜欢这些语言中的任何一种。回到C++(再次)。 我的最爱是Cython

+0

呃,C++。至少你的理由是对的。 – 2011-09-19 07:23:18

+1

这是错误的。它不知道这是否在2010年是正确的,但你不必坚持下去。使用nogil syntex可以在任何时候释放gil,而无需进行python调用。 – Matt 2013-11-18 05:04:19

+1

“Google提供的单个编译器”在这两方面都是错误的。有'gc',并有['gccgo'](https://golang.org/doc/install/gccgo)(加上我认为更多,但是那些是大的)。 Go与许多非Google贡献者完全开放源代码;谷歌可能会放弃或放弃明天Go会没事的。 – 2015-03-27 19:57:12

相关问题