python調用golang
A. 電商後台api使用golang還是python寫好
go看過幾個程序,挺強大的。比如有一個weedfs分布式文件系統。
至於好用。腳本語言是容易編程,容易維護,但是不容易調試。2000年左右python是腳本語言之王,現在也是排名靠前的。
go是類似java設計定位,應用范圍比java還要小的一個語言。可能需要很多年成長才會好用起來。
要說好用呢,語言熟悉了,都好用。無論是basic, python, c, c++還是java,用熟悉了感覺是相同的,開發速度也比較接近。 不過整體上腳本語言要比編譯語言開發速度快幾倍。但是運行時出錯的幾率也大了幾倍。
B. 如何利用Golang為Python編寫模塊
Go裡面需要顯示的引入C模塊, 讓編譯器支持生成動態鏈接庫, 並且在代碼中可以使用C語言的專數據類型,這個屬至關重要. Calling Go code from Python code 摘取一個最簡單例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//libadd.go
package main
import "C"
//export add
func add(left, right int) int {
return left + right
}
func main() {
}
go build -buildmode=c-shared -o libadd.so libadd.go
from ctypes import cdll
lib = cdll.LoadLibrary('./libadd.so')
print("Loaded go generated SO library")
result = lib.add(2, 3)
print(result)
C. python寫爬蟲好還是golang
我的思路是這樣,因為自己起點低,還精力有限,又想彎道追上技術潮流,所以專著眼屬未來,選擇Golang。既然敢叫雲技術語言,那麼它的性能自然是適合未來發展的,像facebook這樣的大公司貌似也挺重視它…最最主要的,賭它未來能全棧應用,期待可以直接上手用Go開發Android和iOS應用的那一天~
框架選擇上嗎,初級選手建議Revel(開源案例比較多,老框架、Go官方給予了該框架很高的評價),其實Go語言眾多框架性能都很卓越,水平高的不用框架直接玩更爽。順嘴吐一下槽,Go語言框架之多如少女臉上的青春痘~
對了,選擇Go語言的好處是,各個社區學習互助氛圍比較好,你去哪個網上社區去請教問題,都會有人熱情解答~
D. Djiango和python是什麼關系,怎麼用python使用Djiango啊
Djiango是一個python語言實現的網路框架。一個網路框架包括哪些內容,這個你要自己去網路啦。
E. 如何看待將Python代碼轉換成Go代碼並進一步編譯的Grumpy
如何看待將Python代碼轉換成Go代碼並進一步編譯的Grumpy
不建議使用Go,還沒有成熟(雖然它是Google發布專的,但Google現在推的屬是Python並不是Go哦)。
Python和Ruby都是不錯的語言,他們都是跨平台的,且是解釋性程序語言。
Ruby還不是很出名,他與Python一樣都是面向對象的。Python/Ruby/Go的資料在中國里是很少的,不過也可以藉助Google看國外的資料(英語好這是做程序的人必須的)
個人建議使用Python好,因為很多程序員都大力向Python供庫,使得程序簡單幾句話完成重大的任務。Python還被稱為膠水語言,因為他很容易跟其他的語言(如C++)合並編程,如果你以後學其他語言的話,這對你是很有幫助的。
如果從性能方面的話,Go總比Python/Ruby快,因為Go不是解釋性語言。
F. 如何將Python的正則式轉換成Golang正則式
你的這一條正則表達式是要匹配「雙引號之間除換行之外的所有字元,並以名稱為first為名進行捕獲 但是,這里卻使用了貌似只有Python支持的P
G. Python開發者在轉到Go語言之前需要了解什麼
轉載請參見文章末尾處的要求。【感謝張佳偉(@ghosert)的熱心翻譯。如果其他朋友也有不錯的原創或譯文,可以嘗試推薦給伯樂在線。】這是一篇(長)博文, 介紹了我們在 Repustate 遷移大量 Python/Cython 代碼到 Go 語言的經驗。如果你想了解整個故事,背景和所有的事情,請繼續往下讀。如果你只是想了解 Python 開發者在一頭扎進 Go 語言前需要了解什麼,請點擊一下鏈接:從Python遷移到Go的建議(Tips & Tricks) 背景在Repustate,我們完成過的最棒的技術成就之一是實現了阿拉伯語的情感分析。阿拉伯語是一塊難啃的硬骨頭,因為它的詞形變化相當復雜。比起譬如英語,阿拉伯語的分詞(將一個句子切分呈幾個獨立的單詞)也更困難,因為阿拉伯語的單詞本身還可能會包含空白字元(例如:「阿列夫」在一個單詞里的位置)。這也談不上是泄密,Repustate 使用支持向量機(SVM)來獲取一個句子背後最有可能的含義,並在其中加上情感元素。 總體上來說,我們使用了 22 種模型(22 個 SVM) 並且在一篇文檔中,每一個單詞我們都會加以分析。因此如果你有一篇 500 字的文檔,那麼基於 SVM,會進行十萬次的比較。 PythonRepustate 幾乎完全就是一個 Python 商店。我們使用 Django 來實現 API 和網站。因此(目前)為了保持代碼一致,同時使用 Python 來實現阿拉伯語情感引擎是合情合理的。只是做原型和實現的話,Python 是很好的選擇。它的表達能力很強悍,第三方類庫等等也很好。如果你就是為了Web服務,Python 很完美。但是當你進行低級別的計算,大量依賴於哈希表(Python 里的字典類型)做比較的時候,一切都變慢了。我們每秒能處理大約兩到三個阿拉伯文檔,但是這太慢了。比較下來,我們的英語情感引擎每秒能處理大約五百份文檔。 瓶頸因此我們開啟了 Python 分析器,開始調查是什麼地方用了那麼長時間。還記得我前面說過我們有 22 個 SVM 並且每個單詞都需要經過處理嗎?好吧,這些都是線性處理的,非並行處理。所以我們的第一反應是把線性處理改成 map/rece 那樣的操作。簡單來說:Python 不太適合用作 map/rece。當你需要並發的時候,Python 算上好用。在 2013 Python 大會上(譯者:PyCon 2013),Guido 談到了 Tulip,他的這個新項目正在彌補 Python 這方面的不足,不過得過段一段時間才能推出,但是如果已經有了更好用的東西,我們為什麼還要等呢? 選Go 語言,還是回家算了?我在Mozilla的朋友告訴我,Mozilla 內部正在將他們大量的基礎日誌架構切換到 Go 語言上,部分原因是因為強大的 [goroutines]。Go 語言是 Google 的人設計的,並且在設計之初就把支持並發作為第一要務,而不是像 Python 的各種解決方案那樣是事後才加上去的。因此我們開始著手把 Python 換成 Go 語言。雖然Go 代碼還不算正式上線的產品,但是結果非常令人鼓舞。我們現在能做到每秒處理一千份文檔,使用更少的內存,還不用調試你在 Python 里遇到:醜陋的多進程/gevent/「為什麼 Control-C 殺不了進程」這些問題。 為什麼我們喜歡 Go 語言任何人,對編程語言是如何工作(解釋型 vs 編譯型, 動態語言 vs 靜態語言)有一點理解的話,會說,「切,當然 Go 語言會更快」。是的,我們也可以用 Java 把所有的東西重寫一遍,也能看到類似更快的改善,但那不是 Go 語言勝出的原因。你用 Go 寫的代碼好像就是對的。我搞不清楚到底是怎麼回事,但是一旦代碼被編譯了(編譯速度很快),你就會覺得這代碼能工作(不只是跑起來不會錯,而且甚至邏輯上也是對的)。我知道,這聽上去不太靠譜,但是確實如此。這和 Python 在冗餘(或非冗餘)方面非常類似,它把函數作為第一目標,因此函數編程會很容易想明白。而且當然,go 線程和通道讓你的生活更容易,你可以得到靜態類型帶來的性能大提升,還能更精細的控制內存分配,而你卻不必為此在語言表達力上付出太多的代價。 希望能早點知道的事情(Tips & Tricks)除去所有這些贊美之詞以後,有時你真的需要在處理 Go 代碼的時候,相對於 Python,改變一下思維方式。因此這是我在遷移代碼時記錄的筆記清單 —— 只是在我把 Python 代碼轉換到 Go 時從我腦子里隨機冒出來的點子:沒有內建的集合類型(必須使用map,並檢查是否存在)因為沒有集合,必須自己寫交集,並集之類的方法沒有tuples 類型,必須寫你自己的結構,或者使用 slices (即數組)沒有類似 \__getattr__() 的方法,你必須總是檢查存在性,而不是設置默認值,例如,在 Python 里,你可以這樣寫 value = dict.get(「a_key」, 「default_value」)必須總是檢查錯誤(或者顯式的忽略錯誤)不能有變數/包沒被使用,因此簡單的測試也需要有時注掉一些代碼在[] byte 和 string 之間轉換。 regexp 使用 [] byte (不可變)。這是對的,但是老把一些變數轉換來轉換去很煩人Python 更寬松。你可以使用超出范圍的索引在字元串里取一個片段,而且不會出錯。你還可以用負數取出片段,但是 Go 不行你不能混合數據結構類型。也許這樣也不太干凈,但是有時在 Python 里,我會使用值是混合了字元串和列表的字典。但是 Go 不行,你不得不清理干凈你的數據結構或者使用自定義的結構不能解包一個 tuple 或者 list 到幾個不同的變數(例如:x, y, z = [1, 2, 3])駝峰式命名風格(如果你沒有首字大寫方法名/結構名,他們不會被暴露給其它的包)。我更喜歡 Python 的小寫字母加下劃線命名風格。必須顯式檢查是否有錯誤 != nil, 不像在 Python 里,許多類型可以像 bool 那樣檢查 (0, 「」, None 都可以被解釋成 「非」 集合)文檔在一些模塊上太散亂了,例如(crypto/md5),但是 IRC 上的 go-nuts 很好用,提供了巨大的幫助。從數字到字元串的轉換(int64 -> string) 和 []byte -> string (只要使用 string([]byte))不太一樣。需要使用 strconv。閱讀Go 代碼比起 Python 那樣寫起來如偽代碼的語言更像一門編程語言, Go 有更多的非字母數字字元,並且使用 || 和 &&, 而不是 「or」和「and」寫一個文件的話,有 File.Write([]byte) 和 File.WriteString(string), 這點和 Python 開發者的 Python 之道:「解決問題就一種方法 」相違背。修改字元串很困難,必須經常重排 fmt.Sprintf沒有構造函數,因此慣用法是創建 NewType() 方法來返回你要的結構Else (或者 else if)必須正確格式化,else 得和 if 配對的大括弧在同一行。奇怪。賦值運算符取決於在函數內還是函數外,例如,= 和 :=如果我只想要「鍵」或者只想要 「值」,譬如: dict.keys() 或者 dict.values(),或者一個 tuples 的列表,例如:dict.items(),在 Go 語言里沒有等價的東西,你只能自己枚舉 map 來構造你的列表類型我有時使用一種習慣用法:構造一個值是函數的字典類型,我想通過給定的鍵值調用這些函數,你在 Go 里可以做到,但是所有的函數必須接受,返回相同的東西,例如:相同的方法簽名如果你使用 JSON 並且 你的 JSON 是一個復合類型,恭喜你。 你必須構造自定義的結構匹配 JSON 塊里的格式,然後把原始 JSON 解析到你自定義結構的實例中去。比起 Python 世界裡 object = json.loads(json_blob) 要做更多的工作 是不是值得?值得,一百萬倍的值得。速度的提升太多了,以致很難舍棄。同時,我認為, Go 是目前趨勢所在,因此在招新員工的時候,我認為把 Go 當作 Repustate 技術積累的重要一環會很有幫助。]
H. 為什麼我不會舍棄Python投奔Go語言
在Go語言中,規定的方式是,函數返回錯誤信息。這沒什麼。如果一個文件並不存在,op.Open函數會返回一個錯誤信息。這沒什麼。如果你向你一個中斷了的網路連接里寫數據,net.Conn里的Write方法會返回一個錯誤。這沒什麼。這種狀況在這種程序中是可以預料到的。這種操作就是容易失敗,你知道程序會如何運行,因為API的設計者通過內置了一種錯誤情況的結果而讓這一切顯得很清楚。
從另一方面講,有些操作基本上不會出錯,所處的環境根本不可能給你提示錯誤信息,不可能控制錯誤。這才是讓人痛苦的地方。典型的例子;一個程序執行
x[j],j值超出數組邊界,這才痛苦。像這樣預料之外的麻煩在程序中是一個嚴重的bug,一般會弄死程序的運行。不幸的是,由於這種情況的存在,我們很難寫出健壯的,具有自我防禦的伺服器——例如,可以應付偶然出現的有bug的HTTP請求處理器時,不影響其他服務的啟動和運行。為解決這個問題,我們引入了恢復機制,它能讓一個go常式從錯誤中恢復,服務餘下設定的調用。然而,代價是,至少會丟失一個調用。這是特意而為之的。引用郵件中的原話:「這種設計不同於常見的異常控制結構,這是一個認真思考後的決定。我們不希望像java語言里那樣把錯誤和異常混為一談。」
我剛開始提到的那篇文章里問「為什麼數組越界造成的麻煩會比錯誤的網址或斷掉的網路引出的問題要大?」答案是,我們沒有一種內聯並行的方法來報告在執行x[j]期間產生的錯誤,但我們有內聯並行的方法報告由錯誤網址或網路問題造成的錯誤。
使用Go語言中的錯誤返回模式的規則很簡單:如果你的函數在某種情況下很容易出錯,那它就應該返回錯誤。當我調用其它的程序庫時,如果它是這樣寫的,那我不必擔心那些錯誤的產生,除非有真正異常的狀況,我根本沒有想到需要處理它們。
有一個你需要記在心裡的事情是,Go語言是為大型軟體設計的。我們都喜歡程序簡潔清晰,但對於一個由很多程序員一起開發的大型軟體,維護成本的增加很難讓程序簡潔。異常捕捉模式的錯誤處理方式的一個很有吸引力的特點是,它非常適合小程序。但對於大型程序庫,如果對於一些普通操作,你都需要考慮每行代碼是否會拋出異常、是否有必要捕捉處理,這對於開發效率和程序員的時間來說都是非常嚴重的拖累。我自己做開發大型Python軟體時感受到了這個問題。
Go語言的返回錯誤方式,不可否認,對於調用者不是很方便,但這樣做會讓程序中可能會出錯的地方顯的很明顯。對於小程序來說,你可能只想列印出錯誤,退出程序。對於一些很精密的程序,根據異常的不同,來源的不同,程序會做出不同的反應,這很常見,這種情況中,try
+
catch的方式相對於錯誤返回模式顯得冗長。當然,Python里的一個10行的代碼放到Go語言里很可能會更冗長。畢竟,Go語言主要不是針對10行規模的程序的。
就是要說明這一點:Go語言程序員認為,把error作為一種內置的類型是非常重要的。
I. python如何實現go to
python一般用while True+break來實現goto
J. python主程序調用類中計算值
雖然Python優點很多,但是有一個致命的缺點就是運行速度太慢,那麼Python程序需要一些計算量比較大的模塊時一般會調用c或者c++的代碼來重寫,但是c/c++編寫代碼代價太高,耗費太多的人力,開發周期太長,那麼就想到來一個折中的方法是用golang語言。
雖然golang性能比不上c、c++,但是golang天生的高並發,以及編譯速度超級快,而且還自帶垃圾回收機制,不用開發者自己去管理內存,開發效率高。所以在Python程序遇到大計算量時,可以考慮調用go模塊。接下來我們來看看如何在利用go模塊寫Python第三方模塊,以及如何在Python中導入並調用。