Python生产力VS Java生产力


24

在SO上,我遇到了一个问题,即哪种Java或Python最适合在Google AppEngine上开发。许多人吹嘘使用Python而不是Java可以提高生产率。关于Python与Java生产率的争论,我要说的一件事是,Java具有出色的IDE来加快开发速度,而Python由于其动态特性而在该领域确实缺乏。

因此,即使我更喜欢将Python用作语言,但我认为与Java相比,它不能显着提高生产率,特别是在使用新框架时。显然,如果它是Java vs Python,并且您可以使用的唯一编辑器是VIM,那么Python可以极大地提高您的生产率,但是当将IDE引入方程式时,它就不是那么明确了。

我认为Java的优点通常仅在语言水平上评估,并且常常基于过时的假设,但是Java在语言本身之外具有许多优点,例如JVM(经常受到批评,但潜力巨大),出色的IDE和工具,大量的第三种政党图书馆,平台等。

问题,Python /相关的动态语言是否真的可以带来经常提到的巨大的生产率提升?(考虑使用新框架并使用中型到大型应用程序)。


2
检出PyCharm IDE。而且,我相信GAE有一些新框架可以将Java代码转换为JavaScript以便在前端使用,这可能会大大提高生产率。
Andrew M

14
不论是否使用IDE,您仍然需要编写10行Java代码才能用Python的一行代码完成某些事情。

2
不要为您对Java的热爱而感到羞耻。您已经学到了一些技巧(IDE,库和框架),这些技巧可让您踢屁股。拥抱它。您不需要我们的许可就可以了。如果Java使高效,那么就足够了。
Scant罗杰

1
1)JVM的潜力非常有限。故意。它不是“坏”的,它只是,很好,是限制性的。2)仅当您要做的是集成数百个现有组件(这是一种有效且受人尊敬的编程,但不是唯一的一种)时,IDE才能提供帮助。在实现复杂算法方面,Python比Java生产力高得多(即使像lambda函数和列表推导之类的东西也有很大的不同)。
SK-logic

1
如果您的IDE大大提高了生产率,那么您或您的编程平台很可能出了点问题。(Smalltalk是一个例外,因为它创建了一个用于编程的全反射系统)。
Marcin

Answers:


18

Python的主要优点之一是其“包含电池”的理念:广泛且易于使用的标准库。在Java中,仅读取文本文件就需要几行代码,嵌套的阅读器等。在Python中是f.read()。这无疑将极大地提高生产力,尤其是在快速原型制作中。Python语言通常也不太冗长,这不是一件坏事(尽管我认为冗长和简洁的重要性常常被过分强调)。

但是,如果您已经在某个框架(例如GAE)上工作,那么我希望差异会小得多,并且主要取决于个人对语言的流利程度。您将只需要将框架与您选择的语法连接在一起,Python强大的标准库几乎无济于事。


真的需要学习如何使用GAE。您会推荐任何在线教程系列吗?我熟悉 Python,但是对GAE却一无所知。谢谢!


4
或者,您可以添加带有一行Maven配置的Apache Commons IO,然后也可以一行读取文件。包括电池在内的方法对我来说是一把双刃剑。
jiggy

@jiggy:我在某种程度上同意;Python的电池几乎总是有用且通常足够用,但是显然标准库无法满足所有可能的用途,因此有时您不得不依赖库。
乔纳斯·普拉卡

2
读取Java中的文本文件:List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));。还不错!(这是3月11日尚未发布的Java 7)。
assylias 2013年

19

这是我的2美分。以我的经验,Python适用于中小型项目,而对于大型项目,我使用Java的效率更高。

通常,对于较小的项目,我可以使用动态类型的语言(如Python(或PHP)):它不太复杂,您希望快速完成它,并且不会出错。在这种情况下,我发现Python可能更实用。

但是,当我必须开发更大的软件时,我更喜欢像Java这样的静态类型的语言,因为我更喜欢编译器为我执行尽可能多的检查。我的经验是,在大型项目中,与Python相比,与Python相比,我必须花更多的时间来修复错误,因此,如果用Java编写代码花费的时间更多,我就不会打扰,因为这样可以节省时间。


6
+1,完全同意。我喜欢在较小的项目中使用Python和类似的语言,在这里我可以将自己的脑袋缠绕在它们的整个范围上,而不会遇到太多麻烦。问题出在大型项目中,您必须在其中推断组件之间的接口。再加上较弱的重构支持,使我对生产大型,稳定,可维护的系统的信心下降。必须编写和维护许多测试,以弥补编译器执行的静态分析的不足。当达到这一点时,快速初始迭代的好处就失去了维护性。
bunglestink

我同时使用,而且我都喜欢。我完全同意你的看法。
Daniel Baktiar

11

我在使用更强大的语言(例如Python或Ruby)时效率更高。某些Java代码是否可以由IDE生成并不重要。还有更多代码需要阅读和维护。遍历重复的代码并找到重要的部分将花费更多的时间,并且需要花费更多的时间来进行更改。Eclipse可以转换为很好

private Date dateOfBirth;

至:

private Date dateOfBirth;
public Date getDateOfBirth() { return dateOfDeath; }
public setDateOfBirth(Date d) { dateOfBirth = d; }

但是每次我开课时,我都会看到那个垃圾,必须略过它才能找到有趣的部分。同样,在维护期间,错误可能会引入生成的代码中。

我宁愿看到:

attr :date_of_birth

对我来说,需要IDE与Java有效配合使用是选择其他语言的一个很好的理由。

也许更强大地比较以下Ruby代码:

avg = people.filter { |p| p.height > 200 }.collect(:weight).average

针对类似的Java代码:

List<Double> weights = new ArrayList<Double>();
for (Person p: people) {
  if (p.getHeight() > 200) {
    weights.add(p.getWeight());
  }
}
return Stats.average(weights);

Ruby代码是该规范的直接翻译:高于200(cm)的人的平均体重。评论完全是多余的。

Java代码需要大量的工作来进行读写。

保罗·格雷厄姆使得在这个编程语言为简洁令人信服的论据文章。在完成某些研究生水平的数学学习后,我发现他的论点令人信服,而反对简洁的论点却微弱。当然,高级语言中的单行可能比低级语言中的单行更难理解,就像偏微分方程比简单的加法难于理解一样。但是,比起替换的五行或十行,使用一种功能强大的语言的一行更容易理解。想象一下,阅读用单词而不是符号编写的数学文本。


我没有使用Python,但是使用了具有自动属性的C#。在Python中向其中添加逻辑有多少工作(例如触发事件或验证逻辑)?
mlk

@mlk-“ attr”语句来自Ruby。在Ruby中,设置属性后附加行为非常简单。
凯文·克莱恩

在python中,所有类属性都是自动公开的,因此大多数时候您将直接访问它们。
zhhaohao

3
Python不需要getter或setter-只需dateOfBirth公开即可。如果以后需要在get或set上添加逻辑,请添加一个_dateOfBirth来存储数据,然后使用get和set方法创建一个propertynamed dateOfBirth。调用代码在Python中根本不需要更改。Java只使用访问器,因为它没有“属性”的概念。
Izkata 2012年

1
使用Java 8和流,您的平均体重代码可以这样编写:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
体外

7

几年前,我从Java迁移到Python,个人觉得我的工作效率更高。正如@Joonas指出的,很多生产力来自打包的库。但是其中一些来自语言本身。我无法想象没有字典,列表推导,高阶函数和外壳程序。

请记住,如果您已经知道Java,则需要一段时间才能熟练使用Python。


7

这是一个老问题,但是我想添加我的$ .03。我认为这也很大程度上取决于您的思考方式。我真的无法忍受动态的解释语言。另一方面,我是静态类型语言的忠实拥护者。当然,使用Java可能会更加冗长,但是我发现一旦说完就完成了,它更易于阅读和维护。我发现Python,Ruby和Perl非常难以阅读(对我而言)。即使我尝试过,我也无法将头缠住它。也就是说,我可以在Scala中编写代码就可以了,没什么大不了的。我认为这取决于您的适应程度。最终,Java将变得更加强大。比Ruby,Python或Perl更胜一筹。JVM是一项引人注目的技术,学习利用其功能可能对您非常有益。


1
同意,请确保您可以真正快速地使用Python,但是这可能成为以后调试或添加新功能的噩梦,这就是为什么它通常被称为“原型语言”,这就是我认为它对(或对广告-特殊类型的脚本)
programmx10

2
那天什么时候结束?我们已经等了20年了,Java仍然没有一流的功能或任何元编程工具。同时,C#取得了长足的进步。在过去的一年中,我开始编写Groovy代码而不是Java,从而极大地提高了生产率。Groovy代码比相应的Java代码小得多,而且更易于理解,因为噪音已经消失了。
凯文·克莱恩

@Kevin Cline-我知道您在说什么-过去六年来我一直是.NET开发人员。我并不是在谈论生产力,而是纯粹的编译时间,并发性和多核类型的东西。Java和JVM(Groovy,Scala等)JVM是最重要的东西,不一定是Java本身。
Nodey The Node Guy

2
@ programmx10 Python代码的可维护性取决于您编写代码的方式。如果您全部花了一大笔钱,那么当然您将无法调试它。另一方面,如果您已经很好地组织了代码并将功能分为模块和类,那么它与Java代码一样容易维护(如果不是那么容易的话)。
哲豪·毛

5

我发现Python,Ruby,Javascript和SQL比Java等编译语言的生产力要高得多,因为这些语言具有非常快速的反馈循环。您可以在命令行上运行几行代码,并立即知道代码是否正确。如果它引发异常,您会立即知道。使用Java,您必须进行编译,打包和部署,对于大型系统而言,这通常需要几分钟的时间,因此反馈周期非常缓慢。

快速的反馈周期使您可以快速迭代到一个好的解决方案,这就是使动态语言更具生产力的原因。


该词的绝佳应用feedback loop
两栖的,2014年

3

我最近在做更多的Python,并且很长一段时间一直是Java程序员,对于全新的开发,我认为我在python方面的工作效率更高。Java中许多相当简单的事情可能有点乏味,例如文件/流处理,从URL读取内容,对XML进行序列化等。在python中只取一个。但是,使用正确的工具(例如番石榴或其他Collections API)确实可以帮助解决这一问题。

我想我说的是python的一个优点是它附带了许多功能,您需要使用java中的第3方库来获取它。

综上所述,对于某些事情,在Java中比在python中生产力要高得多,尤其是在重构和使用大型代码库等方面。


1
Java是关于库的,但是Python拥有很多方法,就像PHP一样,要记住所有这些方法,使用Java时,您只搜索适当的库,然后至少可以选择使用的内容
programmx10

1
@ programmx10您在说什么?Python有很多用于各种事情的库。只需查看标准库的文档即可。Python库分为模块,就像Java库分为包一样。
zhhaohao
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.