個人充電,想學一門替代python的語言?
本身非程序猿,不過工作和學習中用電腦非常多,以前一直用Python,而python也讓我很滿意,樣樣都能做,從管理系統到自動化執行程序,再到網上抓資料,真的是很棒,關鍵是寫東西非常快,但最近突然覺得有點膩味了,尤其是想真正寫個正經程序的時候,發現那性能簡直讓人吐血。
當然,這多半是我戰鬥力太差的緣故,畢竟不是專業搞計算機的。而性能高用得廣的語言,Java和C#我都是一竅不通,那個C++我懂個皮毛,基本上就是屬於最簡單的小程序能寫,寫個稍複雜的程序就會各種崩的層次,最關鍵的是這玩意寫東西實在是太慢了啊啊啊啊。最近閑的蛋疼,想學一門性能強一點,程序對資源的佔用不要那麼誇張的語言,具體來說就是最好是靜態語言,最好能帶上能用的GC,最好是新一點的,滿足我折騰的慾望。噢,這語言開發效率不能太低了啊,畢竟是個人用的,實在無力去搞一門像C++那樣可以造殲星艦,不過在開工之前還得自己提煉礦石的語言。請各位高手推薦,謝謝。
A Pythonista"s irresistible attraction to Rust除了 GC 之外其它都滿足,因為 GC 對程序效率的影響太大啦。當然,也不用你手動管理內存的申請和釋放的。
Scala可以一戰。
在一年多以前,我還是Python的死忠,而現在,我已經徹底投奔Scala了。
原因非常簡單,Python的大部分優點Scala都有,並且做得更好。
- Scala的Collection庫相比於Python簡直不知道高到哪裡去了(就體系來說,恐怕也就Haskell可以與之一戰。然而,Scala的Collection庫要實用的多)。以前一直覺得Python的list comprehension非常好用,然而Scala有更好的(源於Monad)。
- Scala代碼非常簡潔,擁有基於流的類型推導。簡單來說,就是動態語言的手感。
- Scala提供了編譯期的類型安全。這是靜態語言相比動態語言的優勢,而且和類型推導配合,幾乎沒有增加書寫成本
- 良好的生態系統。其實是JVM的生態系統,來自Java的福利。
- 運行效率足夠。Scala的運行效率和Java在一個量級上,很大程度上取決於你代碼的寫法(類似於C++之於C),你總是有辦法寫出和Java代碼一樣高效的模塊(如果真的需要的話)。
- 良好的編程效率。我個人體驗來說,Scala的編程效率肯定是超過Python的,雖然這種體驗是建立在自己有足夠FP編程經驗之上的。實際上Scala的學習同樣有助於更好的編寫Python代碼
- - -
當然,Scala也有一些缺點
- 學起來有那麼一點難。如果之前沒有接觸過FP可能一開始會誤入歧途。我總是看到Java程序員用Scala寫的難以直視的Java代碼,每次看到這種情況我就感覺到非常可惜,他們無法享受到Scala帶來的福利
- 編譯慢。最直觀的感受就是MacBook的續航受到了嚴重的挑戰(編譯CPU消耗大,持續時間長)
- JVM的生態圈還是不如Python全面的。科學計算方面,JVM上並沒有成熟的社區。
- - -
更新:
評論裡面有人建議上代碼,當然,我是反對的。我覺得對於Scala的評判完全無法基於第一感覺而來(比如語法),我個人最初接觸scala的時候完全感受不到這語言的優雅,因為很多feature你一開始是不能理解的(有一些甚至於到現在都還不能駕馭)。
說起來,我個人轉向Scala完全是非常偶然的因素——使用Spark的需要。只不過在使用的過程中Scala給了我意外的驚喜。要不然,我是斷然不會輕易往只有JVM支持的語言上投入這麼多精力的。
如今,我可以以一個過來人的身份告訴大家,在Scala上的投入是值得的,它確實非常優秀)。
- - -
對於其它一些推薦的語言,我也簡單比較一下:
- Rust。如果我現在想再學一門語言,那毫無疑問,那肯定是Rust。因為我覺得它能cover掉Scala的大部分feature,也具有獨特的優點。
- Go。相比之下,這是一門比較簡單的語言,我覺得如果不是有特定的項目驅動,並沒有刻意學習的必要。要知道,Go是不支持泛型的。如果你當初寫python的時候是list-comprehension到處用的話,斷然是不能接受的。
仔細地看了若干遍你的需求,我決定給你推薦Haskell。下面詳細分析:
想學一門性能強一點
Haskell在使用GHC編譯的情況下性能普遍很贊,這裡有一個大概的benchmark: https://wiki.haskell.org/Benchmarks_Game
最好是靜態語言,最好能帶上能用的GC,最好是新一點的
Haskell是靜態強類型,Haskell有GC,Haskell上世紀90年代才出現,這麼多年一直在加入新的東西
滿足我折騰的慾望
毫無壓力,Haskell以耐折騰聞名世界,再能折騰的人在Haskell上也能得到滿足。有那麼一大群精力過剩的人甚至折騰了它十多年
這語言開發效率不能太低
熟練Haskell以後,Haskell的高抽象帶來非常高的開發效率。以我為例,寫一個簡單的lambda calculus interpreter,用Haskell大概只需要100行多一點代碼,C++的話至少三百以上,用Haskell的耗時是C++的一半以下。這還是用C++時使用了簡單寫法的情況,如果用和Haskell一樣麻煩的做法搞的話C++代碼量和時間至少翻倍。(其實這個例子舉得比較無賴-_-)(補充一下,這裡的實現里是手擼了一套Parser Combinator的。。。調庫的話就超級短了)
畢竟是個人用的,實在無力去搞一門像C++那樣可以造殲星艦,不過在開工之前還得自己提煉礦石的語言
恰恰相反,在使用Haskell造殲星艦之前,你需要擔心的不是得自己提煉礦石,而是Haskell幫你準備好的零件太多了你得自己好好挑選決定用哪個。
額外說一點學Haskell的好處。學過Haskell以後,學其他語言普遍有非常非常非常大的速度加成,而且Haskell學的越深入,這個加成就越驚人。。。好吧,不抖機靈,題主你可以感受一下這個 https://golang.org/ (可能要翻牆,グレート?ファイアウォール罪大惡極!)
Erlang不算新,性能不賴,功能豐富,速度(特別並發能力)超群。同理Haskell啥的類似,可造殲星艦武器合發動機,不太能造殼兒。
Lisp/Clojure 萌萌噠語言。可以做的事情很多,模塊啥的也很多。Lisp家族方言特別多,其中最容易見到的是elisp(重型殲星艦Emacs的插件系統)和Clojure(JVM解釋版,輕鬆勾搭Java)
ECMAScript(javascript是其「方言」)解釋執行,執行層有V8有JIT所以速度可觀,啥都能造,只是變種啥的太多了,版本一變新特性也層出不窮。
Lua 輕量級解釋型,解釋器就一c庫,隨時掛靠C/C++,自帶GC。
Rust 新得很,版本間變化較大,輪子不算多但是覆蓋面不錯。用作用域控制內存而沒有使用GC,但仍能很好地自動管理內存使用。被視作C++的接班人之一。非常好奇樓主你到底寫了什麼東西?能夠讓Python都慢到讓人吐血的程度。
我靠Python混飯吃這些年,還真沒遇到語言的性能門檻。也可能是我做的項目都太low了。先要確定不是你本身的寫法有問題,否則不論你是換Java, C#,C++甚至C乃至彙編,也還是一樣會慢到讓你吐血的。寫法不對,這不是換語言能解決的啦。如果排除了寫法和數據結構設計問題,樓主有木有考慮換個性能好點的機器來跑呢?這可比換語言代價小哦。
Nim Programming Language。。。。。
https://github.com/larva-lang/larva-lang夠新吧,只是沒庫而已,有興趣補充么
人活著不學lisp 那和鹹魚有什麼區別?
每天拿Python做數據科學,也沒遇到啥吐血的性能問題。
python可以加上pypy之類的東西加速啊,而且很多python的庫底層都是c/c++,對你的速度不會有什麼大的影響,樓主確定你自己實現的矩陣運算比用mkl編譯的numpy快嗎
Go語言帶 GC,各方面都符合你要求。不過我更喜歡 Rust語言,不過 Rust 不帶 GC。
Crystal
滿足你所有需求了. 靜態, GC, 新, ruby的語法, 開發起來會很爽. 關鍵的是, 學習成本還很低. (跟rust比的)
當然, 如果你想要學完了之後能用來幹活, 可以考慮kotlin.同樣滿足你的這些需求.新一點的語言有F#
看來在我學過的一籮筐語言中 只有F#適合題主了…靜態 有GC 帶類型推導 模式匹配 入門簡單 寫東西方便(有fsi REPL環境和fsx 寫腳本 也可以編譯為dll和exe) 庫也多 畢竟是.NET上的語言製圖有FSharp.chart 數學計算有http://Math.NET還有type provider可以方便調用R以及matlab的代碼
性能也高
為什麼沒有人說 Julia 我很納悶。
F#是首選。
入門可以看 Home | F# for fun and profit還有 F# Software FoundationSuave.IOWebSharperYoutube 上有許多視頻(需要翻牆)可以自學。書籍推薦: Expert F# 4.0 / Beginning F# 4.0Python的性能都能成問題……你用了啥啊……不會是單線程爬蟲吧……
我跟你講,天下烏鴉都是黑。
看語言官網曬特性的時候,感覺都能拯救世界,寫幾個月以後就渾身難受。Go語法就是個奇葩,協程調度傻了吧唧的連搶佔都不是,錯誤處理滿天飛,更別說還沒有范型!
Rust語法倒是正常了,但是層次和Cpp一樣,還得自己做線程池自己做並發控制,第三方庫沒幾個stable的!
JavaScript背後有npm撐腰是很好,但是同伴的代碼質量簡直沒法控制,語言本身的奇葩之處也數不勝數,每代ES新出的特性都讓人覺得多到記不住,再加上調教回調的各種手法,你的代碼年年風格不一樣!
Erlang的特性非常穩定,不愧是出身於高並發高實時場景的東西,配合OTP威力巨大。問題是一來這個社區實在是太冷淡了,二來凡是你用到erlang的時候都是很大流量的地方,最後你發現流量大到一定程度還是得去調VM,然後又一次回到原始社會!為什麼沒人說ruby
推薦閱讀:
※自動處理excel數據,用什麼語言合適?
※python 3.4 下載了PIL第三方模塊,whl格式,如何安裝?
※計算機研二女生 幾乎沒什麼整個項目經驗,編程也馬馬虎虎,現在想要自學python找工作 難嗎?
※自學php或python到什麼程度才能找到工作?
※職業PHP開發,想再學一門語言。GO or Python ,以備後面轉。那個更適合?