2009-11-16 215 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

相關問題