Java与Hadoop上的Python
我正在使用Hadoop开发一个项目,它似乎本地合并了Java并为Python提供了stream式支持。 是否有重大的性能影响select之一? 如果在某种程度上存在显着的绩效差异,那么我在任何一个方面都可以做到足够早。
Java的dynamic性不如Python,并且已经将更多的努力投入到了VM中,使其成为一种更快的语言。 Python也被全局解释器锁(Global Interpreter Lock)阻止,这意味着它不能将单个进程的线程推到不同的核心上。
这是否有显着的不同取决于你打算做什么。 我怀疑这两种语言都适合你。
用Python你可能会更快地开发,而且Java肯定会跑得更快。
谷歌“基准游戏”,如果你想看到所有stream行的语言之间的一些非常准确的速度比较,但如果我记得正确,你说的速度快3-5倍。
也就是说,现在很less有处理器受到束缚,所以如果你觉得你可以用Python来更好地开发,那就去吧!
在回复评论(Java如何可以比Python更快):
所有的语言处理方式不同。 Java在C和C ++之后是最快的(它可以比Java快5倍,但是平均快两倍)。 其余的是从2-5 +倍慢。 Python是Java之后更快的一种。 我猜C#和Java一样快,也许速度更快,但是基准testing游戏只有Mono(稍慢一些),因为它们不能在Windows上运行。
这些说法大部分都是基于计算机语言基准游戏 ,因为每种语言的倡导者/专家都会调整用特定语言编写的testing,以确保代码具有良好的针对性。
例如, 这显示了所有使用Java和C ++的testing,您可以看到从大约等于java的速度范围慢了3倍(第一列在1和3之间),并且java使用更多的内存!
现在这个页面显示了java vs python(从Python的angular度来看)。 所以速度范围从python比Java慢两倍到174倍,python通常会在代码大小和内存使用率上超过java。
另一个有趣的地方在于 – 分配了大量内存的testing,Java在内存大小方面实际上执行的性能也明显好于Python。 我非常确定java通常会因为虚拟机的开销而失去内存,但是一旦这个因素出来,java可能比大多数(除了C之外)效率更高。
顺便提一下,这是Python 3,另一个testing过的Python平台(简称Python)则更加糟糕。
如果你真的想知道如何更快,虚拟机非常聪明。 它编译为运行代码之后的机器语言,因此它知道最可能的代码path并为其优化。 内存分配是一门艺术 – 在OO语言中非常有用。 它可以执行一些令人惊叹的运行时优化,而不是非VM语言所能做到的。 它可以运行在非常小的内存空间中,并且是C / C ++和embedded式设备的首选语言。
我曾在安捷伦的信号分析仪(思想昂贵的o范围),几乎整个事情(除了采样)是用Java完成的。 这包括绘制包含跟踪(AWT)的屏幕并与控件交互。
目前,我正在为所有未来的电缆盒工作。 指南以及大多数其他应用程序将用Java编写。
为什么它不会比Python更快?
您可以将Hadoop mapreduce转换写成“streaming”或“custom jar”。 如果你使用stream媒体,你可以用你喜欢的任何语言编写代码,包括Python或C ++。 您的代码将从STDIN中读取并输出到STDOUT。 但是,在0.21之前的hadoop版本中,hadoopstream式传输仅用于将文本(不是二进制文件)传输到您的进程。 因此,你的文件需要是文本文件,除非你自己做一些时髦的编码转换。 但现在看来补丁已经添加了,现在允许使用hadoopstream的二进制格式。
如果您使用“自定义jar”(即,您使用hadoop库在Java或Scala中编写了mapreduce代码),那么您将有权访问允许从stream过程input和输出二进制(以二进制序列化)的函数并将结果保存到磁盘)。 所以未来的运行速度会更快(取决于你的二进制格式比你的文本格式小)。
所以,如果你的hadoop工作将被I / O绑定,那么“custom jar”方法将会更快(因为Java比以前的海报显示更快,并且从磁盘读取的速度也会更快)。
但你必须问自己,你的时间有多宝贵。 我发现自己使用python的效率更高,编写读取STDIN并写入STDOUT的map-reduce非常简单。 所以我个人会build议去Python路线 – 即使你必须自己计算二进制编码的东西。 由于hadoop 0.21处理非utf8字节数组,因为有一个二进制(字节数组)替代python使用( http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/ ),它显示python代码只比“自定义jar”java代码慢大约25%,我一定会去python路由。