Java能做的事Python也都能做,但是为何(企业级)开发项目大多还是会选择Java? 是效率?

2012-09-26 00:01:28 +08:00
 tedd
且Python也是There's only one way to do it,相信多人协作代码的控制也不是问题,此外Python也能跨平台。是因为大型项目一半不用解释型语言,因为效率的考虑吗?
97808 次点击
所在节点    Python
151 条回复
vicalloy
2012-10-03 22:32:48 +08:00
@ivanlw 用同一框架,python程序员写出的东西还是比较一致。
应当说java语言层面的东西做了很多约束来避免程序员犯错。
比如java里可以定义接口,如果接口实现不符合规则就无法编译通过。我认为接口功能对大规模开发非常有利。在协作开发时会起到很好的约束作用。
在人海战时你无法保证每个人员都足够优秀,人员的变动也无法避免。这导致一些低级问题的出现,同时问题的查找会非常麻烦。对java,编译器(ide)就可以帮你发现不少低级错误。在构架设计好接口后,下面的开发人员把接口实现,只要能编译通过,通常不会有什么太大的问题。
zope等python框架也自己实现了类似java接口的东西。就我感觉有些别扭。既然用python就应当充分发挥python的优点,而不是去学些旁门左道。如果把python整的象java,我为什么不直接去用java(这也是我一直不看好zope的原因)。
vicalloy
2012-10-03 22:41:43 +08:00
@lvsoft 用python开发时因为性能问题需要自己用c写扩展的机会比java要大不少。这也是大家普遍反映jni不好用(有些易用性还不错的第三方方案),但官方就是不改进的原因。在一点程度上说java官方是不鼓励使用jni的。
大多公司都希望技术体系能尽量单一。大家都用java好过大部分人用python,一两个人用c(python,c双修的牛人不好找)。
lvsoft
2012-10-03 23:04:29 +08:00
@vicalloy 这个说到点子上了。但是回到我之前的观点,在企业级应用中,IO才是瓶颈,架构设计是否合理才是问题的关机。很少有python性能成为瓶颈的地方。真遇到这种少数场合,那么极端场合当然需要极端的技术来解决,这方面python也有cython这种比java/jni灵活性高的多的方案。
reus
2012-10-03 23:33:23 +08:00
@lvsoft 硬伤的那些,你可以看我在此帖的第一个回复之前的那些回复。
bash调用C程序也是纯bash代码,一行C都没有,shell就是这么用的。但出力的是C不是bash,bash总不能狐假虎威。作弊不作弊,各人评判标准不同,你认为不算也没问题的,摊手
lvsoft
2012-10-03 23:59:29 +08:00
@reus ...我不是说不算啊...我说了你完全可以用bash调用各种各样的c实现,一行c代码不写来解决问题。只要你这样的调用方式你喜欢,并且实现性能足够高就行了,可实际上你做不到啊。连浮点运算都得通过bc来搞,快的起来么?然后你又说那直接全部用C写了bash来调。那你不还是碰C代码了么?这个不是标准相同不相同的问题,这个是有没有节操的问题好不好?
reus
2012-10-04 00:33:26 +08:00
@lvsoft
你根本就没理解我说的
bash调用了c程序,而c程序当然是用c代码写的
python调用了gevent,而gevent里也有c代码
你看懂这个比喻里本体和喻体的对应关系了吗?
python -> bash
gevent -> c程序
bash+c程序不能算pure bash代码,python+gevent也不能算pure python代码
只能以pure code来比较,或者也可以使用不pure的code来比较,这就是我说的不同的评判标准。我认为不可以,你认为可以,分歧就只在这里,关节操什么事呢?
lvsoft
2012-10-04 00:59:08 +08:00
@reus 我完全理解,而且我觉得你就是在为了坚持你的观点而坚持,所以才说你这个已经是节操问题了。

你用bash只能通过进程通讯使用C啊,bash以进程间通讯调用C的pure bash代码性能有多差你应该有概念吧?你给出的解决方法是用C完全重写你所需要的应用,然后用bash在最外层调用。那你99%的工作量都在c里面,这个还能算是pure bash代码么?

gevent的例子里面,哪里有C程序?所有我要写的代码都是python代码啊,gevent自身用c实现的关我什么事?python自身还是用c实现的呢,python vm的loop还是在c里面呢?你去关心这些干嘛?按照你的理论那是不是所有python的优势都可以归功于C了啊?

所以最终没啥标准不相同的啊,大家都只以pure code比较。java下只写pure java,python下只写pure python,bash下只写pure bash。允许你调用各自的第三方library也好,第三方module也好,第三方的什么东西都行。都是各自所属的生态链上的东西,凭啥不能调用?

在此前提下,至少在这个gevent例子里,python是最优的,你说python是因为libevent也没错,但也这只是理由之一,难道python的轻量级设计思路,比jvm少了一层封装的设计,导致比java overhead少,难道这些不是真正的原因?否则java为啥不能模仿?为啥不自己基于epoll造个轮子也好,基于jni调用libevent也好,java为啥不这么做?或者说为啥这么做了也没用?
reus
2012-10-04 01:44:58 +08:00
@lvsoft 我所说的完全是基于我对这个的理解,你的揣测还是收回去吧,没必要在技术讨论里使用“节操”之类人身攻击词汇。

我已经说了“bash+c程序不能算pure bash代码”。不论c占了多少比例。你第二段的话纯属误解。

我还说了“python调用了gevent,而gevent里也有c代码”
“python调用了gevent”,指的是“python的gevent例子里调用了gevent这个library”,这部分是纯python,没有c代码是自然的,你第三段开始的反问又是一个误读。
而gevent这个library里的c代码,对应bash所调用的程序里的c代码。既然bash+c程序不能算pure bash,那自然,python+gevent也不能算pure python。

使用了gevent这个库的python程序不能算pure python,我再次重申我的观点。

而你认为这是pure python,这又是不同的标准。

动态强类型的python,比静态强类型的java的runtime overhead少?CPython vm比jvm效率高?你不知道java有nio?不知道netty?
lvsoft
2012-10-04 16:28:04 +08:00
@reus OK。bash + C是通过binary link还是通过process exec?如果是binary link,那么压根就没有多少bash扩展。如果是通过process exec,那么性能极差。无论哪种,都能说明你所举的bash例子没有任何意义。按照你的定义,pure bash下你几乎啥都做不,别说甩9条街了。

python不调用gevent,就算用raw socket最终也要调glibc的。java也是一样。
不然怎么创建fd?怎么进行网络IO?那么按照你的意思,这个“使用C”的边界到底在哪里?凭啥python通过gevent调用epoll就是调用C,jvm通过glibc调用epoll/select/what ever就不是调用C?

讨论问题,大家首先得在一个公理系统内,不然就是鸡同鸭讲。所以说,你首先得给出一个令人信服的边界。不给出边界,不做出明确的定义,直接做各种无意义的类比,我只能说你是来搅浑水的,当然不要怪我说你没节操了。“没节操”这3个字也没有上升到人身攻击的高度,这只是对你这种做法的吐槽而已。

我给出的判定依据很简单,假设你只会java,我只会python,再来一个只会bash的人。大家都不会C,更不懂得怎么写C extension。在这个前提下谁的解决方案好就是谁好,这个判定依据很合理,也具有实际意义。

你不同意,那么你倒是说个更合理的判定依据呢?还是说你只会一味的说这个方法作弊?

就算是你说什么作弊,那jvm不是在某些benchmark中比C还要快嘛,有什么好怕的呢?
或者按照你这种必须完全得pure code的标准,我是不是可以认为jvm通过jit编译成native code,用native code替换pure code实现也是作弊?

最后,我没有说cpython vm比jvm效率高,我说的是overhead低。而overhead高的原因有很多,光举一个动态强类型对比静态类型的说法没有意义,而且这个问题要说清楚太折腾,都可以另开个话题了。
所以,我对你的吐槽,完全是针对你举的bash那个例子开始的。咱先别急岔话题,先把这个问题说说清楚,OK?
jamiesun
2012-10-04 17:06:43 +08:00
python的世界发展很快的,python3.3已经发布了,新的yield from也是让人眼前一亮的东东,gevent已经扔掉libevent了。当然gevent这样的优秀模块也不是唯一的,出自facebook的Tornado也是非常棒的。

事实如此,在很多领域,人们眼中的“胶水语言”已经完全比java做的更好,已经不能仅用胶水语言来形容。
reus
2012-10-04 17:42:37 +08:00
@lvsoft 早就说了我们标准不同,也就是判断依据不同。我所说的,当然是依照我的标准,我的依据。因为我是在表达我的观点。我并不是要让你信服,并不是要统一标准,并不是我认为python不适合企业级应用开发,并不是害怕jvm在测试里败给python+C。我的观点和依据,都说得很清楚了,不要再叫我给依据了,你就看多几遍我的回复就是了。你不同意我的看法,你的依据甚至公理系统都和我的不同,ok啊,我接受这个事实。你说我的回复无意义,搅混水,没节操,我也只能摊手了。你很难接受别人的看法和你的不同吗,非得别人接受你的才算是说清楚吗,别人不同意你的看法就是无意义的是搅混水? 这个问题我已经充分表达了我的观点,不会再讨论,变成flame war只会浪费时间
raptor
2012-10-05 13:49:25 +08:00
@reus
你太纠结了。
就语言层面,没有人否认JAVA比较快,就计算密集型应用来说,JAVA比C#要快50%,比python快130倍,比pypy都快10倍以上。
但是就应用来说,追究背后实现就没意义了。以pypy为例,python可以有这样一个python写的jit,JAVA也弄个来比比嘛。拿C++写的JVM是不是也算作弊。
不论gevent背后用什么,至少在python里用的时候可以不需要自己写C代码,完全是纯python代码。bash什么的,干什么事都能找到现成的可执行文件来组合实现也可以啊,只要别自己写C代码,那当然算作弊。
chanjarster
2012-10-05 14:03:13 +08:00
怎么能够比哪个语言比较快?快的不是语言,是VM啊,要比也应该比JVM和PVM哪个比较快嘛。
不过如果比VM的速度的话,就和语言无关了。
fwee
2012-10-05 16:39:13 +08:00
@raptor 求具体数据,说java比c#快第一反应就是不信
gislord
2012-10-05 19:50:14 +08:00
@raptor Java比c#快50%?同求具体测试数据。。
tonyseek
2012-10-05 22:14:40 +08:00
对企业级开发来说,语言优劣可能并不是要考虑的因素,反而怎样有大量廉价劳动力才是真正的问题,这种工业生产毕竟不像互联网企业的工艺品作坊生产。不是黑 Java,而是廉价劳动力不在 Java/.NET 阵营找可能他处就找不到了。

至于比较语言性能神码的,最后能用的性能才有意义嘛。何必去看底层是 C API 还是别的作弊方式,跟小学数学竞赛一样的感觉。
momo5269
2012-10-05 23:49:20 +08:00
对了 节操不是什么人身攻击....如果有点熟悉同人领域的话...实在只是吐槽用语而已...
null
2012-10-06 00:18:30 +08:00
下面这三段话引用自Paul Graham写于2001年的一篇预言Java的文章:

1. “就像情景喜剧和垃圾食品或是旅游团的发明者一样,Java的设计者有意识地设计了一个供没有他们聪明的人使用的产品。从历史上来说,被设计成提供给他人使用的语言都不怎么样: Cobol, PL/I, Pascal, Ada, C++都是这样的。好的语言是那些设计者为自己创造的语言,比如C, Perl, Smalltalk, Lisp.”

2. “Java有太多维护人员。最好的编程语言一直以来都是被一小拨人开发出来的,但Java似乎是被一个委员会所维护的。如果Java最终被证明是一门好语言,那历史上会首次出现委员会设计出了一门好语言这样的事情。”

3. “Java是为一些大型组织所设计的,大型组织和程序员们有着不同的目标。他们希望一种适合于一大帮平庸的码农所使用的语言,这种语言的特点就是把愚蠢的人所犯的错误的破坏力减到最小,就像U-Haul卡车上的限速器一样。”
fwee
2012-10-06 01:21:56 +08:00
@null

好的语言是那些设计者为自己创造的语言,比如C, Perl, Smalltalk, Lisp

真是的啊
raptor
2012-10-06 13:30:13 +08:00
@fwee
@gislord
数据来自milo老师的实测。当然仅限于这种计算密集型的情况,不代表所有情况。
http://zoomquiet.org/res/scrapbook/ZqFLOSS/data/20100917132156/index_0.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/48721

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX