Ruby 和 Python 相比有什么优势和缺陷?

转自:http://www.zhihu.com/question/19552194

知乎工程师
汪汪、Xana Hopper、yao long 等人赞同
Ruby 和 Python 太相似了,取舍大部分都是个人喜好上的原因。比如我就觉得 Python 的 “There is only one way to do it.” 比 Ruby 的 “There are many ways to do it.” 要好,这不光是考虑团队协作的问题,更重要的是自己能很快明白自己三个月前写的没有任何注释的代码是在干什么。当然也有很多人觉得自由和灵活要比可读性来的重要,所以我说这个是个人喜好的原因。

客观上的 Ruby 比 Python 的优势我想到的有这么几个:

Block 应该是语言层面上 Ruby 比 Python 更酷的地方,Python 的匿名函数(lambda function)制约太多,属于鸡肋(BFDL GvR 不认可函数式编程的许多方面)。

OS X 上的话,Ruby 比 Python 最重要的优势可能是 MacRuby (http://www.macruby.org/) 的存在。我大胆猜测以后 MacRuby 将成为 Objective-C 之外(如果不是完全替代的话)的苹果官方语言。MacRuby 除了能更加方便快捷的创建 Cocoa 应用外,ruby block 使得利用 OS X 的 Grand Central Dispatch 变得容易,在以后的多核、混合核(CPU+GPU)应用上非常重要。

劣势:

Ruby 的硬伤之一在于性能。官方实现 Ruby 1.9 比 CPython 逊色不少。另外 Python 拥有诸如 Numpy, Psyco, PyPy, Cython 等多种性能倍增的途径,相比之下 Ruby 想要提高性能的途径则非常有限。

Ruby 的硬伤之二在于第三方包。Ruby 传入英语世界并大规模流行起来的时间不长,大部分的第三方包都和 Web 相关,Web 领域外的包数量远远不及 Python。特别是在科研等方面的区别非常明显,很多学科领域都有基于 Python 的成熟应用,而几乎找不到 Ruby 的相关包。这除了历史渊源,也和 Python 更加简洁的语法(很多用 Python 做研究的人不是计算机专业的)以及前述的性能倍增器(主要是 Numpy 和 Scipy)有密切的关系。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~以下是评论
王骍,A Programmer
山海雍和、小天狼星、刘永辉 等人赞同
刚在G+上写了篇帖子,贴一下。有些观点和前面的观点有所重复,请见谅。

正文如下:

本周的Pycoder's Weekly不错,第一个Topic是:

“What are the advantages of Python over Ruby?”
这是Quora上的一个问答,网址在:
http://www.quora.com/What-are-the-advantages-of-Python-over-Ruby

Python和Ruby阵营之间似乎一直在争论谁更好(貌似Ruby阵营的人们更狂热些),不信可以试试google一下“Python Ruby”。上面这篇文章我目前还没看,在看之前先说说我的个人看法:

Python优于Ruby的地方:

a) Python开发人员的背景丰富多彩,阵营规模很大,这直接导致了Python的各种lib比Ruby多很多很多很多

b) 和Ruby相反,Python的哲学是“做一件事情有且只有一种方法”(There should be one-- and preferably only one --obvious way to do it.)。Ruby的信徒会觉得这样非常boring,但是我觉得这一点减轻了人们在开发时的认知负担和选择成本,对于提高开发效率是很有帮助的。同时,这个特点使得不同的人用Python写出来的代码不至于相差很大,这对于团队合作也是很有用的。(这点也导致了Python中是有公认的Best Practice的,但是Ruby中就很难找到一个公认的Best Practice)

c) Python在面向对象上做的并不好,其实是把面向过程和面向对象杂糅起来了。(随着Python 3的发展相信这点会有所改观)我个人虽然感觉这样不太好,但是实际用的时候就会发现,不强调面向对象其实能够减轻程序员的认知负担,写起代码来会比较随心所欲,对于c程序员来说也更容易接受。(好吧,如果你觉得这点是Python的缺点,那么其实你也是对的~)

d) Python开始慢慢走进大学一年纪的教科书,可以预见,未来的Python开发者阵营会继续不断壮大。(当然Ruby的阵营也会越来越大)

e) Python解释器,特别是CPython,目前比现有的Ruby解释器快很多。这点Ruby的发明人Matz也是很想再重新写个Ruby的虚拟机,但是苦于要做的事情很多,不知道什么时候能完成。Ruby的运行效率目前来看实在太慢了些。(当然程序运行效率和代码是如何写的也有很大关系,想让Ruby程序尽可能快的话,除了一般的程序优化方法外,还要注意要多用built-in的东西,因为它们是用c写的,运行快)

f) Python的语法比较简单,容易上手。


说了这么多Python优于Ruby的地方,现在再来说说我觉得Ruby优于Python的地方:

a) 第一个印入我的脑海的优点是:有趣!当你开始慢慢学会使用Ruby后,你就会觉得Python的代码真TM是死板的不能再死板了。这是因为Ruby从Perl中继承的一条哲学是和Python完全相反的:“每一件事情总是有多种做法”(Having more than one way to do the same thing)。所以程序员的创造力就完全被激发出来了。当你看到某个问题的一种前所未见又十分优雅的解决方案时,你会有一种混杂着强烈喜悦的惊讶的——写(优美的)Ruby能够激发人的灵感。

b) Matz在设计Ruby的时候就想方设法让Ruby成为一个“人性化”的语言,力求使Ruby程序员感觉到使用Ruby是一件愉悦的事情。你能从Mixin、程序块、元编程、极具包容性的语法等等当中获得一种喜悦。

c) 纯粹的面向对象,极其强大的元编程功能。Ruby是纯粹的面向对象。CSDN的范凯曾经说过:“你学习了Ruby以后,你就会发现,原来Java/C++所谓的面向对象就是TMD的山寨版本的面向对象,原来面向对象还可以这样玩啊”(http://robbin.iteye.com/blog/969154)。Ruby的元编程能力还有宽松的语法使得使用Ruby可以很轻松的开发DSL(Domain Specific Language),这一点Python是搞不定的。

d) Ruby on Rails!要不是DHH开发出了RoR不知道现在还会有多少人在用Ruby。毋庸置疑,RoR是快速Web开发的神器。为什么RoR那么牛?有一个很重要的原因就是RoR将Ruby的元编程能力发挥到了极致,“甚至到了一种变态的程度”(Matz语,见《松本行弘的程序世界》http://book.douban.com/subject/6756090/ P.S.想要了解Ruby设计思想的话此书一定要读一读,起码是部分章节)

e) Ruby吸收了很多语言(Lisp、Smalltalk等等)的特性,对于程序员来说了解一下Ruby对于开阔思路是很有帮助的,它能帮助你更好的看清你之前一直使用的语言的限制之处在哪。

暂时就想到这么多,应该还有很多补充的空间。我使用Python和Ruby的时间也很短,所以还是多多参考些Python和Ruby双料大牛们的意见吧~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-04-28 4 条评论      

杨昆,天地一逆旅 同悲万古尘
知乎用户、yaway、易文勃 等人赞同
ruby的优势
===========
- ruby不强制缩进
- ruby有着更强大的语法,使用更灵活
- 一件事通常有多种做法,就像茴香豆的茴有多种写法一样
- ruby on rails很酷
- ruby更OOP
- ruby更适合geek

python的优势
============
- python强制缩进
- python有着更简单的语法,上手更容易
- python更易读
- 一件事通常只有一种最优的方案
- Python有着更多更成熟的库
- Python可以预编译成bytecode
- Python的性能更好
- Python更适合团队
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2010-12-31 14 条评论      

赞同4
李伟斋,历任C++、iOS、Ruby on Rails程序员,现…
taotao、leaon、知乎用户 等人赞同
引用一下孟岩的区分标准

Ruby是一种魔幻语言,而Python是一种简约语言

具体可以看看http://blog.csdn.net/myan/article/details/2028545

好吧看我的说明,我也是偏魔幻的爱好者
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-05-29 添加评论      

赞同3
Jiabin,A Maker.
张聪、刘仁杰、薛天禄 赞同
上面好像没人提到,说个对我个人简单而重要的理由:

我觉得 Python 的代码更整洁看起来很漂亮。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-04-02 添加评论      

赞同8
Michael wang,爱好广泛的geeker
Xana Hopper、刘缙、XP Zhang 等人赞同
我发现一个有趣的现象,多年经验的c++ 程序员多数都比较喜欢python ;而有多年经验的java程序员多数都比较喜欢ruby,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-11-04 3 条评论      

赞同3
海鸥,业余编程爱好者。
秋林、张西家、陈泓旭 赞同
这两个我都学了,谈谈自己的想法:
Ruby拿过来,你就写吧,每个人每个写法,同一个问题,可以有n多写法,无所谓孰优孰劣,达到目的就可以了。
Ruby最大的优势就是纯粹面向对象,例如对于一个string a,获取长度,在ruby中很干脆,a.length 或者 a.size;在python中,需要len(a),对于有顽固面向对象思想人来说,python的写法让人受不了。
我个人也是业余爱好,使用的是windows系统,python相对来说对windows更友好,这是我自己实践感觉出来的,django在windows下apache上的配置很简单,ror想在windows上配置能把你折腾到死。
python的强制缩进可以让你养成良好的编程习惯,也便于别人阅读。同时python对于每一个问题,都有一个推荐做法,相对来说,一个人写的程序,另外一个人可以轻易读懂。
python有自己的哲学,python中文用户组的“大道至简”也是我个人比较喜欢的哲学。不要把简单的问题复杂化,“如无必要,勿增实体”。

最后,两者其实都是脚本语言,差不多,学会了一种,另外一种也很容易就学会了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-05-23 1 条评论      

赞同2
刘镇夫,刚上手几个月
雷神、曹力 赞同
你们都说语言了我说点别的吧。

rails比django灵活有趣(别骂我~)
python运行速度快。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-05-29 3 条评论      

赞同0
李遥,A Programmer
我前后想了好几遍,还是觉得这两个语言除了语法糖味道不一样就没什么区别了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-10-30 3 条评论      

赞同0
卢克
找那些你熟悉的技术和工具。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-05-09 添加评论      

赞同1
夏天,A competent programmer
jude 赞同
python爱好者,每个人都需要“万金油”。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-07-19 添加评论      

赞同2
机械唯物主义,python-cn管理员,古典经济学爱好者
杨高峰、叶碧颖 赞同
python语法严谨快速入门
ruby可以以最少的代码量解决问题, 又不失可读性
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-06-06 添加评论      

赞同0
王武,完美
当两个事物深思熟虑还是选不定的时候,随便选一个动起来吧,其实这两个选择对你来说差不多。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-07-05 添加评论      

赞同0
张卫泉,上海数航测控技术有限公司,物联网+云计算
个人比较弱,还是python的可参考的源码跟库多点,能够起到触发的作用,ruby如果不是真的高手,(这个问题自己最清楚)我感觉用不来
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-09-14 添加评论      

赞同0
陈立,VMware 工程师
确实,我也用Ruby好几年了,感觉这个语言灵活度高,比Python是要舒服点,但太像perl了点。同一件事有多种做法就有点让人抓狂。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-12-05 添加评论      

赞同6
李路,http://knewone.com
王超、杨三金、王赟 等人赞同
我个人的选择是是Ruby和Lisp

不要小看编程语言的能力和差异,ruby和python是完全不一样的语言,就像python和perl,perl和php,只有实际写过大量代码做过设计构架的人,才知道一个更优美更适合建筑师(而非工程师)的编程语言能带给自己什么。

我想说性能,平台部署能力,兼容性,都是工程师关心的。对于建筑师来说,唯一关心的,就是语言的表达力(是否简洁?是否可读?)和优雅程度(是否足够抽象?)

当然,函数库也很重要,但,多,不代表好。

想说的很多,但是有人说的比我更好,好的多,我推荐所有对语言之争感兴趣的人,去阅读一下Paul Graham的《黑客与画家》这本书的后面几章。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-06-01 2 条评论      

赞同0
林淼,某公司应用架构师,Java/Python/Objectiv…
补充下,Python可以用Nuitka或者Cython编译成C++/C从而保护源码,方便发布客户端。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2013-06-06 添加评论      

赞同0
Shanicky,计算机专业本科生
ruby2.0之后运行效率已经有了大幅提升了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2013-07-25 添加评论      

赞同0
崖路,找点兴趣、找点动力
不再纠结于比较哪门语言更好!!学习一门新编程语言,熟悉基本语法,很容易,精通其中一部分开发库使用,不容易,灵活使用一门语言,难
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-06-07 添加评论      

赞同3
刘缙,系统编程
山海雍和、猫小喵、刘博洋 赞同
Ruby的确是比Python更干净的OOP,这也不奇怪,Ruby根本就是Smalltalk换了点语法而已。
但这个更干净并不是a.length vs. len(a),名词在前还是动词在前的问题,否则OOP也未免太肤浅了。

在Python里,对于a.f()可能是调用a所属的类的方法f,也可能是调用a的属性f。这个二义性在metaprogramming时带来很多不一致和麻烦,比如Python对__xxx__ magic method lookup的特殊规定。

Ruby没有这个问题。事实上另一个有此问题的语言是C++。C++和Python都是设计者对OOP只有感性认识的时候打的基础...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2013-05-04 添加评论      

赞同12
范凯,互联网创业者,前JavaEye网站创始人
Edwin、张泽涛、David Y 等人赞同
Ruby和Python的编程哲学截然不同,Ruby要比Python优美。

Ruby主要的问题在于core team都是日本人,团队比较小,开发进展非常缓慢,显得活跃度不够。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-03-05 4 条评论      

赞同0
xbu,鲲之大,不知其几千里也
ruby社区设计师较多,产品大多可拆箱就用,python里面要自己搭配,python和ruby生产能力相当,但是很多计算机大牛都钟情python,经常会有很多好玩意儿推出,这是ruby不能比的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-05-29 添加评论      

赞同5
刘关张,1个月内搞定了基础知识和RUBY ON RAOLS框…
左永辉、仲良骏、Ian Ha 等人赞同
一个注重执行效率的工程师更喜欢用PYTHON,一个只需要做快速开发实现IDEA的人更多用RUBY。最大的不同在于你是什么样的人
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-01-30 5 条评论      

赞同2
朱佳祺,业余极端音乐爱好者在程序的大海里漂
汪汪、octo 赞同
python可读性更高,强制缩进很赞,多人工作的时候特别能体会。ruby本身意思不大,纯oo是个好想法但是应用起来不是那么美好。如果没有rails我想ruby不会有今天的地位。rails本身也是个奇怪的东西,开发这个东西的哥们如果更熟悉python我想他不会去用ruby - 那么多conventions跟ruby的理念there are many ways to do it有悖,反而更贴近python。要说ruby哪里真的比python好我目前觉得是gems,真的很方便。个人更挺python。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-05-29 4 条评论      

赞同1
杨高峰,程序员,爱好书法,喜欢苹果产品
知乎用户 赞同
Ruby的优点
Ruby on Rails 太流行
Ruby更接近函数式编程语言,比如lambda表达式更强大

Python的优点
Python语法更简明,上手容易,Ruby语法繁琐,一件事有太多种做法
Google的推广
Python库更多
Python性能更好
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-05-31 添加评论      

赞同2
陈甫鸼,生长于闽,求学入秦,漂泊适燕,实秦人也。
史罗丹、孙大同 赞同
对我来说Python最大的好处是对Unicode的完整支持(2.0版本开始支持GB2312,2.2版开始完整支持GB18030)。记得大概八年前开始我花了大把的时间在XML上,那时候Python对XML的支持还不算完好,但已经足够我把所有GB编码的东西转换成UTF-8进行处理了。

顺便说一句:其实当时几个脚本语言里对Unicode支持最好的还是Perl,但还是觉得包组织太乱了些。Python的Unicode框架简明扼要。当然也可能是因为我自己写过encoding,相对熟悉产生的错觉。

我不选择Ruby最大的理由就是Ruby对Unicode的支持来得太晚,而且至今似乎也不能完全算完善(可能查证不足,见谅)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-05-20 添加评论      

赞同1
Roy Li,微信公众号 mintshow 人生如戏
GhreiC Edwin 赞同
ruby的语法非常赏心悦目, 不过我当年学的时候,用惯了php的时候对内存泄露不好好重视, 毕竟php是直接flush内存的,好在现在1.9x解决了不少这个问题。

理论楼上大牛都解释了,我来举一个实例:

在小于3的整数范围里取 不相同的x, y 列表, 结果应该是
[(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]

为了实现这个功能, python的方法是:
a = []
for x in range(3):
for y in range(3):
if x != y: a += [(x,y)]
ruby的方法是: 3.times{
x
3.times{
y
a < < [x,y] if x != y }}
当然ruby有其他写法,或者类似python里的写法,但是 这简化写法真的太美丽了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-06-02 13 条评论      

赞同0
骆逸,从2004年开始放弃perl投奔python
就语言本身,二者在设计思想方面有很多不同(网上搜python vs ruby,有很多比较),但不存在绝对的孰优孰劣。个人或者团队的选择还是要看需求、环境和自己的特长。总体来说python比ruby成熟,开源支持多一些。因为python强调编程的一致性和代码可读性,更适合较大的团队使用。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2011-03-06 添加评论      

赞同2
马啸天,Geeker
戴文源、李健 赞同
说实话,讨论这种问题纯粹是扯蛋。即使语言本身再好,使用不得当还是无用的。与其关注语言的缺陷,不如磨练自身技巧。即使Lisp再好,思想再先进。现在仍然不是小众语言嘛~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2012-08-18 1 条评论

 

你可能感兴趣的:(脚本语言,python)