我正在使用Hadoop开发一个项目,它似乎本身就包含了Java并为Python提供了流媒体支持.选择一个而不是另一个会对性能产生重大影响吗?在这个过程中,如果某种方式存在显着的性能差异,我可以采用任何一种方式.
使用Python,您可能会更快地开发,并且Java肯定会运行得更快.
谷歌"基准游戏",如果你想看到所有流行语言之间的一些非常准确的速度比较,但如果我没记错的话,你说的速度要快3-5倍.
也就是说,现在处理器很少有东西,所以如果你觉得你用Python开发得更好,那就去吧!
回复评论(java如何比Python更快):
所有语言的处理方式都不同 Java是C&C++之后最快的(它可以比java快,或者比java快5倍,但似乎平均快2倍左右).其余的是2-5 +慢.Python是继Java之后的速度之一.我猜测C#的速度和Java一样快,或者更快,但基准游戏只有Mono(这有点慢),因为它们不会在Windows上运行它.
这些声明中的大多数是基于计算机语言基准测试游戏,这种游戏往往非常公平,因为每种语言的专家都会调整用他们特定语言编写的测试,以确保代码具有良好的针对性.
例如,这显示了使用Java与c ++的所有测试,您可以看到速度范围大约等于java慢3倍(第一列介于1和3之间),而java使用更多内存!
现在这个页面显示了java vs python(从Python的角度来看).所以速度范围从python比Java慢2倍到慢174倍,python一般比代码大小和内存使用情况更好.
另一个有趣的地方 - 分配了大量内存的测试,Java实际上在内存大小上的表现也明显优于Python.我很确定java通常会因为VM的开销而丢失内存,但是一旦出现这种情况,java可能比大多数更有效(除了C之外).
顺便说一句,这是Python 3,另一个经过测试的python平台(简称Python)更糟糕.
如果你真的想知道它是如何更快,那么VM非常聪明.它在运行代码后编译为机器语言,因此它知道最可能的代码路径是什么并为它们进行优化.内存分配是一门艺术 - 在OO语言中非常有用.它可以执行一些令人惊讶的运行时优化,而非VM语言无法做到这一点.它在被迫时可以在相当小的内存空间中运行,并且是嵌入式设备和C/C++的首选语言.
我在安捷伦的一个信号分析仪(想想昂贵的o-scope)上工作,几乎整个事情(除了采样)都是用Java完成的.这包括绘制包括轨迹(AWT)和与控件交互的屏幕.
目前我正在为所有未来的有线电视盒子开展一个项目.该指南以及大多数其他应用程序将使用Java编写.
为什么它不比Python快?
Java没有Python那么动态,并且已经为其VM添加了更多的努力,使其成为一种更快的语言.Python也被其Global Interpreter Lock阻止,这意味着它不能将单个进程的线程推送到不同的核心.
这是否会产生重大影响取决于您打算做什么.我怀疑这两种语言都适合你.
您可以将Hadoop mapreduce转换编写为"流式"或"自定义jar".如果使用流式传输,则可以使用任何您喜欢的语言编写代码,包括Python或C++.您的代码将从STDIN读取并输出到STDOUT.但是,在0.21之前的hadoop版本中,hadoop流只用于将文本 - 而非二进制 - 流式传输到您的进程.因此,您的文件必须是文本文件,除非您自己进行一些时髦的编码转换.但现在看来已经添加了补丁,现在允许使用带有hadoop流的二进制格式.
如果您使用"自定义jar"(即您使用hadoop库在Java或Scala中编写mapreduce代码),那么您将可以访问允许您从流处理输入和输出二进制(二进制序列化)的函数(并将结果保存到磁盘).因此,未来的运行速度会快得多(取决于二进制格式小于文本格式的程度).
因此,如果您的hadoop作业将受到I/O限制,那么"自定义jar"方法将更快(因为两个Java都比以前的海报显示更快,并且从磁盘读取也会更快).
但你必须问自己,你的时间有多宝贵.我发现自己在使用python时效率更高,并且编写map-reduce来读取STDIN并写入STDOUT非常简单.所以我个人会建议你去python路线 - 即使你必须自己想出二进制编码的东西.因为hadoop 0.21处理非utf8字节数组,并且因为有一个二进制(字节数组)替代用于python(http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/),这显示python代码仅比"自定义jar"java代码慢约25%,我肯定会去python路由.