Node.js 与 Python 作为后端服务的编程语言各有什么优劣?

前端,但是想学习一门后端的语言,本来是想学习Node js,毕竟如果把Node作为后端语言对我前端的js的熟悉程度也是有帮助的,但是发现Node学习曲线有点陡,而且也没什么好的学习资料,而且国内Node也不是很流行,发现Python是门不错的后端语言,学习资料也多,现在我在纠结两者之间,求大神指教下?


Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_tornado

尤雨溪前端开发、JavaScript、前端工程师话题优秀回答者



@SUN Ruoyu 针对说Node不擅长CRUD这一点稍微说两句 CRUD应用和平台本身没多大关系,更多是看上层的开源库。express + (mongo + mongoose) || (node-mysql + sequelize) 开发CRUD也快得很,更关键的是Node本身异步的数据库I/O性能上比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框架。



Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_tornado_02

Ruoyu Sun



Disclaimer: 以下对比可能有强烈的个人色彩 Node.js > Python 的地方 快:这个快有两方面,第一是V8引擎快,在V8引擎背后操刀的是 Lars Bak大神,他创造过高性能SmallTalk引擎和Java Hotspot引擎(现在Java的默认VM),他带领下的V8引擎让Javascript速度达到了… 显示全部



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实现更容易。这两个应用场景还是有差别的。




Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_Python_03

沈嵘 产品总监



前面SUN Rouyu的回答已经很全面了。补充一句,npm和commomjs的require已经超越了一个简单的包管理工具,已经发展成为一种系统架构形式。 另外,我用CoffeeScript写Node.js,可以享受两个世界的好处。 Python虽然也有异步库,但是由于异步不是它的DNA,因此… 显示全部



前面SUN Rouyu的回答已经很全面了。补充一句,npm和commomjs的require已经超越了一个简单的包管理工具,已经发展成为一种系统架构形式。
另外,我用CoffeeScript写Node.js,可以享受两个世界的好处。
Python虽然也有异步库,但是由于异步不是它的DNA,因此不同框架和库的实现是很不一致的。这点对Node.js来说,其异步模式已经成为99%的Modules首先要遵守的规范,这个一致性是一个健壮的后台程序所必须的。


Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_Python_04

罗然 大风吹散梦想



必须是python 这里说python不太合理。 如果要对位的话,nodejs对位应该是python的tornado框架。 之前研究过百度的clouda,算是两个都接触过吧。 我重点说说tornado好了,nodejs在tornado面前优势并不大。 首先, 性能 node在性能上相比tornado来说占优,但优… 显示全部



必须是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不用。哪怕要我辞职。



知乎用户 人生很短也很美妙



性能的区别 我不觉得很多人的系统会比paypal更复杂 paypal现在全nodejs(后台BI可能还是java) 不过prototype模式构建大型代码有难度 改造成oo 编程难度和写python没区别 callback不是问题 我没用那些改造callback的js库 纯js原生方式 习惯了就好 显示全部



性能的区别

我不觉得很多人的系统会比paypal更复杂
paypal现在全nodejs(后台BI可能还是java)

不过prototype模式构建大型代码有难度
改造成oo 编程难度和写python没区别

callback不是问题 我没用那些改造callback的js库 纯js原生方式
习惯了就好



子潘 产品经理,来自知道创宇,专注互联网安全。



不妨再参考下这个: Node.js 究竟是什么? Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。 为试图解释什么是 … 显示全部



Node.js 究竟是什么?



Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。


为试图解释什么是 Node.js,本文将简要介绍一些背景信息:它要解决的问题,它如何工作,如何运行一个简单应用程序,最后,Node 在什么情况下是一个好的解决方案。本文不涉及如何编写一个复杂的 Node 应用程序,也不是一份全面的 Node 教程。阅读本文应该有助于您决定是否应该继续学习 Node,以便将其用于您的业务。



Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_Python_05

dong http://github.com/yedf/handy



用过python与nodejs,确实认为python的语言设计,优雅程度都比javascript好,但是实际开发中nodejs确实比python好用 nodejs几大优点: 1. nodejs的环境搭建非常方便,npm包管理也足够好用,几个命令一运行就可以了,而python环境的安装却足够痛苦 2. nodejs… 显示全部



用过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


Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_python_06

PeytonCai


Python的gevent带来的非阻塞IO和coroutine同步方式封装异步,足以完爆Twisted; Nodejs的特性也就是非阻塞IO和更快语言解释器,但是基于事件编程模式更合适对用户响应方式的前端,不太合适大部分是RPC或循环方式的服务端逻辑; 现在分布式和SMP架构下 geven… 显示全部



Python的gevent带来的非阻塞IO和coroutine同步方式封装异步,足以完爆Twisted;
Nodejs的特性也就是非阻塞IO和更快语言解释器,但是基于事件编程模式更合适对用户响应方式的前端,不太合适大部分是RPC或循环方式的服务端逻辑;
现在分布式和SMP架构下 gevent多进程+coroutine+简洁的语言特性+容易C/C++性能扩展绝对是理想选择。



知乎用户 等毕业...



5



刚好两者都接触过。各种网站上的介绍不想重复,谈谈我自己的学习感受。 NodeJs。JavaScript的语法,相比前端能更快的帮助你对模块化和的封装有更深的理解。NodeJS的各种callback回调机制,有时会造成代码嵌套过深,降低没经验的开发者写出来的代码的可读性… 显示全部



刚好两者都接触过。各种网站上的介绍不想重复,谈谈我自己的学习感受。
NodeJs。JavaScript的语法,相比前端能更快的帮助你对模块化和的封装有更深的理解。NodeJS的各种callback回调机制,有时会造成代码嵌套过深,降低没经验的开发者写出来的代码的可读性。单线程+回调函数,程序逻辑有时候会和想象中的不同,一般需要利用一些已有的比如Async库。社区刚起步,一些问题的解决方案很专一(python有时候相对来说可能一个问题有很多不同的选择,可能会让人混乱,不过两者都没问题,看个人喜好)。虽然我之前写过一个用Node的网站,个人感觉代码写的很烂。
python。框架多,可以先从web.py/bottle等轻量级的尝试。python支持很多函数式编程的风格,如果代码写的好,的确会比js写的逻辑清晰。python各种解决方案比较完善,资料也多。个人很喜欢python,怕说多了个人倾向太重,就不多说了。
总之,语言不重要,框架也不重要,性能更没啥考虑的,我觉得尝试新的东西本身就是一件很有趣的事。另外作者是做前端的,那可能js比较纯熟了,可以考虑试试nodejs的express框架。英语ok的话,文档也没啥看不来的。至于node学习曲线陡的问题,个人觉得还好吧,前端er熟悉js有兴趣的话都没啥大问题,node中事件驱动非阻塞等思想还是很有学习价值的~




Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_Python_07

云天明 cc-by-nc-sa 4.0开放授权,不要求署名,特…



上面有人说了nodejs很重要的一个坑就是无法控制并发量而过载 但是,作为一个server,如果你用nodejs过载,那么基本是因为需求太多,你用别的照样过载。 感觉过载这个坑在普通的脚本上更坑一些啊。 另外服务器函数很多时候可以用setTimeout自己来控制并发的… 显示全部



上面有人说了nodejs很重要的一个坑就是无法控制并发量而过载

但是,作为一个server,如果你用nodejs过载,那么基本是因为需求太多,你用别的照样过载。

感觉过载这个坑在普通的脚本上更坑一些啊。

另外服务器函数很多时候可以用setTimeout自己来控制并发的,我在cli程序上的经验是使用process.beforeExit,这个在server上不合适

另外,es6语言挺好的,不要再黑js了好么,python写个fp试试?js这么优雅灵活的语言对吧,你只要放弃oop和强类型的执念就会发现js是多么的有趣了

嗯,我也同意go是个好语言



Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_Python_08

杨捷 脚本语言新轮子:http://deflang.org



我用 PHP Node.js Python 写过抓取脚本,简单谈一下吧。 首先PHP。先说优势:网上抓取和解析html的框架一抓一大把,各种工具直接拿来用就行了,比较省心。缺点:首先速度/效率很成问题,有一次下载电影海报的时候,由于是crontab定期执行,也没做优化,开的… 显示全部



我用 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



知乎用户 PHP/Python/前端


Python的作用毕竟大于Node.js前几天看过Node.js,感觉写起来虽然是JS的语法,可是没有了写JS的感觉,不过Node.js还是比较强大的,不过Python更胜一筹,不仅仅是web端,应用端也不少,EVE Online不就是用Python写的么~~ 显示全部



Python的作用毕竟大于Node.js前几天看过Node.js,感觉写起来虽然是JS的语法,可是没有了写JS的感觉,不过Node.js还是比较强大的,不过Python更胜一筹,不仅仅是web端,应用端也不少,EVE Online不就是用Python写的么~~



Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_python_09

风过留笑




Python,我最近也准备学这个。 显示全部



Python,我最近也准备学这个。


Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_tornado_10

杨欣 慢慢的


企鹅里面就用node加速页面载入 显示全部



企鹅里面就用node加速页面载入


Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_Python_11

刘凯




这个有点儿像宗教,也有点儿小马过河的意思。不同的人开发任务不同,风格不同,入门路径不同,会给你不同的答案。 速度 node.js基于libuv和V8,有npm生态;Python也可以基于libuv,pypy,Cython,有更强大的pip管理器。全部加持后,node.js/python/golang在… 显示全部



这个有点儿像宗教,也有点儿小马过河的意思。不同的人开发任务不同,风格不同,入门路径不同,会给你不同的答案。

速度
node.js基于libuv和V8,有npm生态;Python也可以基于libuv,pypy,Cython,有更强大的pip管理器。全部加持后,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却也是你绕不过的。


匿名用户



得票较多的两个答案都是在 2013 年发布的,我想提提现在的情况(很多答主对 JavaScript 的了解还不够呀)。 Python写起来要比Javascript舒服很多。Javascript设计本身有许多缺陷,毕竟当时设计的时候只是作为在浏览器中做一些简单任务的script,所以代码一… 显示全部



得票较多的两个答案都是在 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.js 的框架express 难度应该与 Python的框架 Django,Tornado,Flask等等差不多。已经熟悉了js,不如还是从Node.js入手。 显示全部



Node.js 的框架express 难度应该与 Python的框架 Django,Tornado,Flask等等差不多。已经熟悉了js,不如还是从Node.js入手。

匿名用户



nodejs使用了libuv这个库来实现异步IO python是个语言。 你可以自由使用select,poll , epoll 等异步io方式,当然也可以使用libuv(如pyuv) 如果很熟悉js的话 nodejs更容易上手些 python语法简单,本身就容易上手 其实拿python和nodejs比还是稍不公平,pytho… 显示全部



nodejs使用了libuv这个库来实现异步IO
python是个语言。 你可以自由使用select,poll , epoll 等异步io方式,当然也可以使用libuv(如pyuv)

如果很熟悉js的话 nodejs更容易上手些
python语法简单,本身就容易上手

其实拿python和nodejs比还是稍不公平,python后面其实还是跟了一大堆框架的

对了python的tornado也是非阻塞的



Node.js 与 Python 作为后端服务的编程语言各有什么优劣?“写做好一件事的小程序,然后把它们串起来”_python_12

Binger 开发




简单逻辑用node,性能确实好,复杂逻辑千万别用,否则哭泣 显示全部



简单逻辑用node,性能确实好,复杂逻辑千万别用,否则哭泣