Go和Cython之间的区别

6
今天我的一个好朋友问我最新的Go语言和Cython(Python的C扩展集)之间的主要区别。我对Python不是很了解,有人能告诉我为什么Go比Cython更好/更差吗?

7
你确定"更好"或"更坏"的标准是什么?这两种编程语言完全不同,它们之间有许多区别,因此它取决于你正在寻找什么。 - Brian Campbell
实际上,我只想知道为什么有人应该使用Go而不是使用Cython,例如,在Go中可以做什么,而在Cython中很难实现?哪些语言具有更好的性能?更好的安全性?更好的用户友好性?更好的调试器?还是所有这些都只是从语法上略有不同的相同事物? - Miguel Rentes
Cython没有任何合理的线程支持,这让我对这门语言失去了热爱。'cython nogil' - unixman83
6个回答

9
Cython并不是传统意义上的语言。它是用于构建Python扩展的预处理器,采用类似Python语法(实际上,他们力求完全兼容Python),并生成C代码(使用Python C API)。通过这样做,他们能够包含一些特殊情况的优化,但真正的好处是在添加Cython特定的静态类型信息时,将其合并到C代码中,绕过Python运行时进行这些操作,从而实现高速提升。
Go是一种编译型编程语言。在Go中可以做的第一件事情就是生成一个可执行文件,其中不包括Python运行时/启动Python解释器 - 这在Cython中是不可能的。(可能从技术上讲不是不可能的 - 但如果您不使用Python,则使用Cython没有任何意义)。由于Cython只是生成C代码,因此您评论中的大多数问题并不适用 - 您可以使用任何C调试器(尽管作为Python扩展的事实使事情变得更加复杂)。

3
关于Cython:我不同意。你需要保持的心态是,你正在使用C语言,而不是Python。编写存根加载器并不难,因为Python是开源的。 - unixman83

5

人们似乎认为Python(Cython)的扩展性很好,我以前也是这样认为,直到我了解了内部机制。查找全局解释器锁(Global Interpreter Lock或GIL),你会明白我在说什么。简而言之,没有真正的线程支持。 - unixman83
1
我知道GIL是什么。因此,我建议使用gevent,它通过使用绿色线程来绕过GIL。虽然它不像Haskell、Erlang或Go那样拥有本地轻量级线程那样好,但对于IO密集型应用来说,它足够好,并且能提供愉快的编程体验。 - Ben Ford
没有使用greenthreads的并发多CPU支持吗? - unixman83
不幸的是,你仍然需要考虑多个进程来充分利用额外的CPU。 - Ben Ford
3
事实上,Cython 支持 with nogil: ... 和使用 OpenMP 的并行支持。这在本地优化方面效果非常好。如果您有阻塞代码(比如通道),Gevent 也可以很好地发挥作用。但是需要注意的是,标准 Python 缺乏对这些功能的支持,这使得这些操作变得更加困难。一种可能性是使用 Celery,这样您就可以将任务分配给多台计算机和多个核心处理。 - shaunc

4

有什么区别?几乎所有方面都不同!

  • 并发和信道。
  • 接口。
  • 静态类型检查。
  • ...

5
呃,Cython拥有所有这些功能,再加上能够利用另外两种更为成熟和强大的语言。 - Matt Joiner
2
上次我检查的时候,Cython 不太支持线程。 - unixman83

2

关于支持,你依赖于谷歌提供的单一编译器。如果Go倒闭或商业化了怎么办?

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

更新:我必须说我现在对Cython很不满意。 缺乏线程支持 是一个重大打击。Cython是线程安全的,但代价很大。全局解释器锁定在函数执行期间一直保持。因此禁用整个代码库的并发执行!

Cython的类C功能文档不完善,对新手来说很困惑。我承认。

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

总之,我不再喜欢这两种语言。又回到C++(再次)。我最喜欢的是Cython


2
这是错误的。我不知道在2010年是否正确,但您不必持有gil。您可以使用“with nogil”语法在任何时候释放gil,而无需进行Python调用。 - Matt
1
“由 Google 提供的单一编译器”这种说法是错误的。事实上,Go 语言拥有 gcgccgo 等编译器(还有其他的,但这两个最为常用)。Go 是完全开源的,有许多非 Google 贡献者;即使 Google 明天倒闭或放弃 Go,Go 仍将继续发展壮大。 - Dave C

1

GO 引入了 goroutines 和 channels。请参阅语言 FAQ


1

我尝试使用Go的主要原因是它被认为很容易将并发引入程序中。我认为这将成为“下一个大事”,因为处理器速度将会减缓,越来越多的多核心可用。如果您想利用多核处理器,您需要编写程序以便可以并发运行。

我之前看过Erlang,但尽管习惯于Prolog,我仍然觉得它有点奇怪;它与'C'或Pascal家族的“普通”编程语言非常不同。但是,一旦掌握了它,它的并发特性就很容易使用。我只需花费很少的精力就能编写一个并行解析器,它不使用堆栈,而是每次出现多个选项时生成一个新的“线程/进程”。

到目前为止,尽管存在一些轻微的不一致性,Go看起来还不错。而且它也很快,这是一个优点。

所以,除非Cython也可以轻松实现并发,否则我会选择Go...


各种形式的并发性至少已经成为了过去30年中的“下一个大事物”;但是要“引入并发性”,就必须重新思考,这并不容易,+1 点赞 易于使用 - denis
1
Cython完全不支持并发(GIL大部分时间被占用)。是的,你可以使用多个进程,但这是一种在Windows下很慢的操作系统级别的并发。 - unixman83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接