Node.js 與 Python 作為後端服務的編程語言各有什麼優劣?

前端,但是想學習一門後端的語言,本來是想學習Node js,畢竟如果把Node作為後端語言對我前端的js的熟悉程度也是有幫助的,但是發現Node學習曲線有點陡,而且也沒什麼好的學習資料,而且國內Node也不是很流行,發現Python是門不錯的後端語言,學習資料也多,現在我在糾結兩者之間,求大神指教下?


@SUN Ruoyu 針對說Node不擅長CRUD這一點稍微說兩句

CRUD應用和平台本身沒多大關係,更多是看上層的開源庫。express + (mongo + mongoose) || (node-mysql + sequelize) 開發CRUD也快得很,更關鍵的是Node本身非同步的資料庫I/O性能上比Python真的高很多。

有人說Node缺少「成熟」的大框架,其實這和Node社區的開發思想有關,幾個領頭的開發者都推崇「寫做好一件事的小程序,然後把它們串起來」的Unix哲學,加上npm對於包之間互相依賴處理得很好,所以靈活性其實是Node的賣點之一。在我個人看來,Node並不需要像rails/django這樣「大而全"的web框架。


個人接觸過Django和少量的Node.js
也在考慮經後的web開發主要使用哪一個?
在我看來,Django更全面,開發一個完整的網站或者cms。
而Node.js的特點也很突出,但是完全用Node.js開發一個完整的網站是不划算的,我更傾向於用Node.js開發RESTful的服務端,可以解決高頻率的請求,同時也避免事件嵌套的深度。
於是,有了這樣的想法,Django做web的開發,在一些需要RESTful或高頻請求的部分用Node.js
各自發揮其長處...


Disclaimer: 以下對比可能有強烈的個人色彩

Node.js &> Python 的地方

  1. 快:這個快有兩方面,第一是V8引擎快,在V8引擎背後操刀的是Lars Bak大神,他創造過高性能SmallTalk引擎和Java Hotspot引擎(現在Java的默認VM),他帶領下的V8引擎讓Javascript速度達到了一個新的階段。第二是非同步執行,Node.js功能上是一個基於V8引擎的非同步網路和IO Library,和Python的Twisted很像,不同的是Node.js的event loop是很底層的深入在語言中的,可以想像成整個文件在執行的時候就在一個很大的event loop里。
  2. npm:npm可以說是用起來最順手的package management了,npm作為Node.js的官方package management,彙集了整個社區最集中的資源。不像Python經歷過easy_install和pip,還有2to3的問題。
  3. Windows支持:Node.js有微軟的加持,Windows基本被視為一等公民來支持,libuv已經可以很好的做到統一跨平台的API;而Python雖然也對Windows有官方的支持,但是總感覺是二等公民,時不時出些問題。

Python &> Node.js 的地方

  1. 語言:就單純從語言的角度來說,Python寫起來要比Javascript舒服很多。Javascript設計本身有許多缺陷,畢竟當時設計的時候只是作為在瀏覽器中做一些簡單任務的script,所以代碼一旦龐大,維護還是有困難(不過Node.js的module很大的改善了這個問題)。不過用Coffeescript可以很大的改善Javascript,幾乎可以和Python等同。
  2. 成熟:成熟包括語言本身已經成熟,還有Framework和ecosystem也很龐大。Node.js的絕大多數framework都很新,有的API一直在變,有的感覺已經不在維護,總之沒有一個像Django那種百足之蟲感覺的framework。Python的主流ORM SQLalchemy也很成熟。

Python 和 Node.js 很難分高下的地方

  1. 非同步Style:Node.js的非同步Style是CPS,也就是層層callback,基於event,和瀏覽器中的Javascript很像。CPS好處是讓熟悉瀏覽器Javascript的人能很快上手,學習難度也不大。缺點是邏輯一複雜,就變得很難維護,基本上需要通過async.js這種library,或者用promise。Python的非同步除了和Node.js很像的Twisted之外,也有基於coroutine的gevent,coroutine讓非同步代碼維護起來更容易,不過學習曲線陡。
  2. 應用場景:如果是一個CRUD的app,那麼想都不想直接是Python,Node.js本身不擅長CRUD的app(絕大多數Node.js都是直接裸在外面的,而不是有一個Nginx在前面,否則websocket就不能用了,不過新版nginx開始支持websocket),代碼又不好維護,而Python的WSGI很適合,成熟的stack也有很多。如果更偏向於real-time,比如一個chat room,那麼Node.js實現更容易。這兩個應用場景還是有差別的。

這個有點兒像宗教,也有點兒小馬過河的意思。不同的人開發任務不同,風格不同,入門路徑,技術背景不同,會給你不同的答案。C/C++開發者推薦你Python,企業IT系統開發者推薦你Java,Web開發者推薦你node.js。

速度
node.js基於libuv和V8,有npm生態;Python也可以基於libuv,pypy,Cython,有更強大的pip管理器。

目前大多數Python框架使用CPython VM,一旦預設使用PyPy/libuv的底層,node.js/python/golang在一個數量級別

非同步
node.js全部是非同步,我使用Twisted、Tornado、gevent,Python3後非同步選擇更多。

技術棧覆蓋
node.js、Python都覆蓋嵌入式、桌面、伺服器,但是Python還覆蓋到IC(VHDL),科學數據分析,金融數據分析。但是前端與UI渲染是Javascript的領域。此外,移動APP也是JS勝出。

與其他語言交互

Python的特徵之一:可以訪問底層語言的,C/C++ DLL/so,Java類庫,.net等。所以多用於整合舊有系統。

在許多特定場合,你可以優選node.js。但是Python卻也是你繞不過的。實際上node.js也必須安裝Python。同樣,在Web/App領域,JS也是Pythoner繞不過去的。

雖然有些離題,但是多少還是有些相關。

CRUD

如果是簡單的CRUD,採用Flask-RESTFul,express或者PHP/Perl/RoR,也是分分鐘開發完畢。如果採用F.A.B,則是秒殺。建模之後直接從ORM直接映射成CRUD,不過路徑有些怪異。

前端

Pythoner可以切換到CoffeeScript來使用JavaScript的框架。這是採用Ruby寫的,但是對於Pythoner來說很熟悉。

很多時候,就具體事情來說,我們需要選擇的不是語言層面,必然是框架完整度、開發靈活度和編碼工作量之間選擇。

大多數情況下,Node.js/Python用來做事情,就像你喝的不同品種咖啡一樣。願意100%的去喝Black/Espresso,願意多加點奶的Latte/Capaccinno,願意加糖自己加,不願意喝咖啡的,去喝純牛奶。

彼此撕逼最無聊。


必須是python 這裡說python不太合理。
如果要對位的話,nodejs對位應該是python的tornado框架。
之前研究過百度的clouda,算是兩個都接觸過吧。
我重點說說tornado好了,nodejs在tornado面前優勢並不大。
首先,性能
node在性能上相比tornado來說佔優,但優勢很小,可以說是language bonus,C++的加成。但是他們的設計思想基本類似,所以性能差距並不大,更何況如果業務處理速度慢了,吞吐量再大也是虛的。
其次,易用性
這一點基於python的tornado完勝,你可以以同步的形式寫出非同步代碼而不需要藉助一大堆回調和閉包,這對於重業務的場景來說是非常注重的,這也是node學習成本陡峭成因,而且一旦使用不好,node一大堆閉包導致的內存爆棧風險想必會折騰每個學習node的人吧。
擴展性
毫無疑問,除了lua,還沒有別的語言可以說有python的擴展性便利了,對於計算密集型的業務或者功能可以輕而易舉的使用C語言來自定義擴展(我甚至寫過一個awk的嵌套編程)。更何況python自身還存在幾何倍數於npm的擴展包(呵呵,反駁我的應該也知道,至少npm好多模塊簡直無法直視,你見過一個模塊只有一個函數,裡面就一句話的嗎?高質量的庫數量簡直無法跟pypi比,開發門檻在那裡呢,所以咬死我都不會承認npm包數量有python多,因為太多垃圾了)。並且你還可以直接對框架層面進行修改跟自定義(當然在許可證許可的條件下),重新定義引擎行為,eventloop行為,自由度高。
可維護性
無需贅言,js代碼很難寫出python的優雅跟風騷,而且各種callback跟閉包對可讀性簡直就是災難。加上js語言本身也有很多坑。這一回合python完勝。

總之,我個人是這麼個情況,如果有人拿nodejs跟tornado來說事,我一定會告訴他我非python不用。哪怕要我辭職。


首先,小慕認為編程語言沒有優劣之分,各有所長,在分析Node.js 與 Python作為後端服務語言的優劣之前,我們可以先來分析一些環境。脫離了具體的環境談問題都是耍流氓,那麼咱們就先從切身利益出發,對比下Node.js和Python的平均薪資、就業前景以及學習成本,我想這才是題主最為關心的問題:

平均薪資

這兩種語言對比主流的後端Java和PHP來講,可以說都是比較小眾的語言,通過職友集的數據來看薪資:

從平均薪資來看,兩者相差無幾,唯一的區別是Node.js中等薪資佔比比Python高一些,低等薪資佔比少一些。

就業前景

從近一年的樣本份數來看,兩者的就業形式有所不同:

嚴謹起見,小慕將Python分為了Python和Python開發工程師,從近三年整體形勢來看,Python總體比Node.js更好找工作。

學習成本

再來看學習成本,我們假定你只有學習一門語言的時間和精力,因為之前有過前端的工作經歷,可能學起Node.js會更簡單些。Node.js語言核心小、更精鍊,更多的語法糖和功能是通過模塊或庫提供,並且Node.js本身就可以用作生產Web伺服器;而 Python 至少前面需要nginx代理。正如題主所說,現在國內Node.js不是很流行,學習資料明顯少於Python,並且在做數據分析和網路爬蟲方面,Python有著更廣闊的應用和優勢。

所以,綜合以上對於平均薪資、就業前景及學習成本的分析,如果題主不單純是為了後端開發,而是希望擁有更好的薪資、前景,小慕更傾向於推薦題主選擇Python。

Python的優勢

我們再來看一下Python和Node.JS的優勢和不足。Python入門簡單,並且經過長期發展,各種Web框架環境非常成熟,主要的一些框架,其介面和用法相對較為穩定,資料也非常豐富(比較詳實的資料大都是英文)。

Python的主流框架大體有三類代表:一是類似Tornado為代表的網路庫形式的框架,提供大量網路工具,對HTTP封裝相對較為簡易,性能較好,而且十分靈活,但使用起來需要對後端處理及Python開發有較多的知識儲備和經驗;二是以Flask為代表的微框架,提供了更加具體的封裝,上手簡單,通過統一的插件介面來規範社區進行擴展開發,且各個組件(如ORM、模板渲染等)往往能夠通過插件將其它開源項目的實現整合進來;三是以Django為代表的大而全的整體框架,有更多成品模板可以套用,開發簡便而且官方組件齊全,工程表現較之前兩者更容易控制,但難以用第三方工具取代其中的各個部分,且性能上通常較差。這三類框架的開發體驗可謂完全不同。

由於Python不僅僅有CPython,還有通過JIT提速的PyPy等實現,因此對於大多數情況而言,提高性能只需要簡單地換個解釋器;Python在分散式開發中,也有更多的成熟套件。此外,Python的社區積累能節省許多工作量。當你需要接入微信/微博/支付寶等各種平台時,PyPI里早就躺著別人已經寫好了直接拿來import就能用的模塊。

Python的不足

Python的缺點主要仍在於性能,雖然入門容易,但「上手就能寫得好」只是個美麗的夢想,通常實際學習周期要比預想的更長。

Python的動態特性幾乎完全符合Python自身的哲學,同時也少很多諸如JS一般的undefined/null/NaN之類的坑,但這些個「哲學」卻與JS有較多差異,因此由JS轉入Python並不簡單。加上Python自身的靈活性,使得開發者若不能對Python有較好理解,很容易寫出Bug,同樣的原因,Python的工程性相對其它靜態語言較差。

目前來看,Python的主要應用已經不再是Web,而更多承擔著諸如複雜計算、模擬、機器學習、數據分析等工作中的介面工作。儘管Python的Web後端開發並不會消失,但市場中使用的頻率無疑會逐漸下降。

Node.JS的優勢

Node.JS實體上還是JavaScript,因此對於有前端基礎的人員而言,該踩的坑大都踩過,語言層面上更容易接受一些。

Node.JS同樣十分靈活,隨著ECMAScript標準逐年更新語言特性更加豐富了。再加上有諸如TypeScript這樣的存在,使得Node.JS在後端動態語言中工程特性尤其突出,十分適合多人協作開發。

Node.JS中的框架大都較為輕型,因為標準庫中對HTTP協議的封裝已經比較高級,所以即使不使用框架,僅僅使用標準庫,作為簡單的Web開發選擇也是可行性很高

Node.JS在服務端渲染過程中,除了模板合成,還能選擇在服務端虛擬瀏覽器中執行JS的形式,這一點其它語言很難做到。

得益於近些年Node.JS的快速發展和普及,主流的中間件等紛紛提供了Node.JS binding,Node.JS社區氛圍較好,而且集中於Web後端領域

Node.JS的不足

Node.JS的缺點主要在於語言、框架、工具的演進都十分迅速,不少工具甚至自身設計都還未穩定,框架、包等跨版本的兼容性問題較為突出。這樣的快速發展和變化下,文檔資料過時的問題十分突出,以至於很難找到學習的資料。而在開發中,使用老框架有坑,更新框架卻又不兼容的情況時有發生。

所以小慕認為,如果只是為了投身於Web後端開發,Node.JS比Python有更大的發展空間;而如果是打算轉行找工作,或許Java、Go-lang、PHP都會是更好的選擇。以上就是小慕的回答,希望能夠為大家帶來幫助~


前面SUN Rouyu的回答已經很全面了。補充一句,npm和commomjs的require已經超越了一個簡單的包管理工具,已經發展成為一種系統架構形式。
另外,我用CoffeeScript寫Node.js,可以享受兩個世界的好處。
Python雖然也有非同步庫,但是由於非同步不是它的DNA,因此不同框架和庫的實現是很不一致的。這點對Node.js來說,其非同步模式已經成為99%的Modules首先要遵守的規範,這個一致性是一個健壯的後台程序所必須的。


上面有人說了nodejs很重要的一個坑就是無法控制並發量而過載

但是,作為一個server,如果你用nodejs過載,那麼基本是因為需求太多,你用別的照樣過載。

感覺過載這個坑在普通的腳本上更坑一些啊。

另外伺服器函數很多時候可以用setTimeout自己來控制並發的,我在cli程序上的經驗是使用process.beforeExit,這個在server上不合適

另外,es6語言挺好的,不要再黑js了好么,python寫個fp試試?js這麼優雅靈活的語言對吧,你只要放棄oop和強類型的執念就會發現js是多麼的有趣了

嗯,我也同意go是個好語言


Python的gevent帶來的非阻塞IO和coroutine同步方式封裝非同步,足以完爆Twisted;
Nodejs的特性也就是非阻塞IO和更快語言解釋器,但是基於事件編程模式更合適對用戶響應方式的前端,不太合適大部分是RPC或循環方式的服務端邏輯;
現在分散式和SMP架構下 gevent多進程+coroutine+簡潔的語言特性+容易C/C++性能擴展絕對是理想選擇。


用過python與nodejs,確實認為python的語言設計,優雅程度都比javascript好,但是實際開發中nodejs確實比python好用
nodejs幾大優點:
1. nodejs的環境搭建非常方便,npm包管理也足夠好用,幾個命令一運行就可以了,而python環境的安裝卻足夠痛苦
2. nodejs強制非同步,io非同步化,mysql非同步,http請求非同步,而且非同步callback是javascript的天然用法,因此實際項目不用太多優化就能比python的同步mysql快很多
3. nodejs與前端統一,實際開發中不需要像python那樣進行環境切換,語言切換
4. nodejs的文件系統watch功能極大的方便了測試,編譯等等,很大程度上提高了開發效率
5. nodejs今天已經形成巨大的生態:npm上的庫是最多的,與後端編程風格非常接近的angularjs,與watch結合的測試框架,webpack,livereload,pm2,所有這些東西對於web開發來說,都遠遠優於其他語言的開發
6. javascript語言的演進也漸漸讓javascript變得更加好用,例如回調逐漸演變為Promise,async/await


性能的區別

我不覺得很多人的系統會比paypal更複雜
paypal現在全nodejs(後台BI可能還是java)

不過prototype模式構建大型代碼有難度
改造成oo 編程難度和寫python沒區別

callback不是問題 我沒用那些改造callback的js庫 純js原生方式
習慣了就好


剛好兩者都接觸過。各種網站上的介紹不想重複,談談我自己的學習感受。
NodeJs。JavaScript的語法,相比前端能更快的幫助你對模塊化和的封裝有更深的理解。NodeJS的各種callback回調機制,有時會造成代碼嵌套過深,降低沒經驗的開發者寫出來的代碼的可讀性。單線程+回調函數,程序邏輯有時候會和想像中的不同,一般需要利用一些已有的比如Async庫。社區剛起步,一些問題的解決方案很專一(python有時候相對來說可能一個問題有很多不同的選擇,可能會讓人混亂,不過兩者都沒問題,看個人喜好)。雖然我之前寫過一個用Node的網站,個人感覺代碼寫的很爛。
python。框架多,可以先從web.py/bottle等輕量級的嘗試。python支持很多函數式編程的風格,如果代碼寫的好,的確會比js寫的邏輯清晰。python各種解決方案比較完善,資料也多。個人很喜歡python,怕說多了個人傾向太重,就不多說了。
總之,語言不重要,框架也不重要,性能更沒啥考慮的,我覺得嘗試新的東西本身就是一件很有趣的事。另外作者是做前端的,那可能js比較純熟了,可以考慮試試nodejs的express框架。英語ok的話,文檔也沒啥看不來的。至於node學習曲線陡的問題,個人覺得還好吧,前端er熟悉js有興趣的話都沒啥大問題,node中事件驅動非阻塞等思想還是很有學習價值的~


我用 PHP Node.js Python 寫過抓取腳本,簡單談一下吧。

首先PHP。先說優勢:網上抓取和解析html的框架一抓一大把,各種工具直接拿來用就行了,比較省心。缺點:首先速度/效率很成問題,有一次下載電影海報的時候,由於是crontab定期執行,也沒做優化,開的php進程太多,直接把內存撐爆了。然後語法方面也很拖沓,各種關鍵字 符號 太多,不夠簡潔,給人一種沒有認真設計過的感覺,寫起來很麻煩。

Node.js。優點是效率、效率還是效率,由於網路是非同步的,所以基本如同幾百個進程並發一樣強大,內存和CPU佔用非常小,如果沒有對抓取來的數據進行複雜的運算加工,那麼系統的瓶頸基本就在帶寬和寫入MySQL等資料庫的I/O速度。當然,優點的反面也是缺點,非同步網路代表你需要callback,這時候如果業務需求是線性了,比如必須等待上一個頁面抓取完成後,拿到數據,才能進行下一個頁面的抓取,甚至多層的依賴關係,那就會出現可怕的多層callback!基本這時候,代碼結構和邏輯就會一團亂麻。當然可以用Step等流程式控制制工具解決這些問題。

最後說Python。如果你對效率沒有極端的要求,那麼推薦用Python!首先,Python的語法很簡潔,同樣的語句,可以少敲很多次鍵盤。然後,Python非常適合做數據的處理,比如函數參數的打包解包,列表解析,矩陣處理,非常方便。

自己最近也在弄一個Python的數據抓取處理工具包,還在修改完善中,歡迎star:yangjiePro/cutout - GitHub


不妨再參考下這個:

Node.js 究竟是什麼?

Node 是一個伺服器端 JavaScript 解釋器,它將改變伺服器應該如何工作的概念。它的目標是幫助程序員構建高度可伸縮的應用程序,編寫能夠處理數萬條同時連接到一個(只有一個)物理機的連接代碼。
為試圖解釋什麼是 Node.js,本文將簡要介紹一些背景信息:它要解決的問題,它如何工作,如何運行一個簡單應用程序,最後,Node 在什麼情況下是一個好的解決方案。本文不涉及如何編寫一個複雜的 Node 應用程序,也不是一份全面的 Node 教程。閱讀本文應該有助於您決定是否應該繼續學習 Node,以便將其用於您的業務。


得票較多的兩個答案都是在 2013 年發布的,我想提提現在的情況(很多答主對 JavaScript 的了解還不夠呀)。

Python寫起來要比Javascript舒服很多。Javascript設計本身有許多缺陷,畢竟當時設計的時候只是作為在瀏覽器中做一些簡單任務的script,所以代碼一旦龐大,維護還是有困難

以及非同步、回調、語法設計缺陷等等問題……:Promise 化,co(利用 yield,ES6 原生支持),ES6 語法 coffeescript,async/await(ES7),decorator,……

個人觀點,我非常喜歡 callback 嵌套參數 passing err 的寫法,一是錯誤優先,而是可以很方便地 catch( if (err) then ... )而不必一層層的 try ... except ...。在開發體驗上,我也傾向於 Node 的「原生非同步、事件驅動,也可以使用第三方庫寫同步代碼」。另外,Node 的庫確實以小而精為主,適合開發 micro services。

由於語言新,沒有語言包袱,所以生長起來很有活力。許多庫 or 框架借鑒了其他語言的優點,另外由於瀏覽器廠商瘋狂地推動 web 規範指定 實現,JavaScript 的改進相當之多。


node:(使用node兩年經驗)

1.node很慢,實測不及java性能30%,cpu和內存利用率很低!

2.內存回收問題巨大,你遲早會被內存搞死!

3.語言設計本身有巨大缺陷(node),強制單線程+非阻塞,簡直就是反人類!

4.js語法過於靈活,很難掌握,很容易寫出無法直視的代碼!

結論:用node你會死得很慘!

推薦:Go,Python,Java8,Rust!


nodejs性能會高一些,但是沒高太多。python的性能跟部署和使用者的經驗有關。

nodejs不好維護,弱類型,據說最新版有強類型了。沒用過,但是感覺不太可能。這種東西應該不好改,這是語言特性啊。

另外,django也挺爛的。用他來跟nodejs比較沒意義。

nodejs是C++的方案,一般放出來的都是二進位包,自己編譯非常難受,

對於經常在AIX之類小型機、大型機上跑程序的人來說,這玩意就是給自己找罪受。

能隨手就可以編譯出來的程序才是靠譜的程序。

因為nodejs的非同步庫在這些平台上沒有解決方案。

解決方案上,python要多太多了。nodejs能做的事情太少。

另外python有多種開發方式,nodejs只有一種非同步模式。

python本身就比js強大太多。js本身就是一種很弱的東西。其實js既不適合後端,也不適合前端。

這也是 為什麼大家都實在受不了了,才發明了那麼多coffescript,dart等等一堆東西,因為js確實太爛了


簡單邏輯用node,性能確實好,複雜邏輯千萬別用,否則哭泣


Python的作用畢竟大於Node.js前幾天看過Node.js,感覺寫起來雖然是JS的語法,可是沒有了寫JS的感覺,不過Node.js還是比較強大的,不過Python更勝一籌,不僅僅是web端,應用端也不少,EVE Online不就是用Python寫的么~~


Node.js 的框架express 難度應該與 Python的框架 Django,Tornado,Flask等等差不多。已經熟悉了js,不如還是從Node.js入手。


推薦閱讀:

大家覺得宜搜發展前景如何?
念 MBA 到底有沒有用?價值體現在哪些方面?
自由職業者如何建立自己的個人品牌?
你如此努力的意義是什麼?
個人發展潛力包括哪些方面?怎樣不斷提高或者發掘或者培養?

TAG:前端開發 | JavaScript | Python | 個人發展 | Nodejs |