53

我正在开发一个使用 Hadoop 的项目,它似乎本身就包含 Java 并为 Python 提供流式支持。选择其中一个是否会对性能产生重大影响?我在这个过程中已经足够早了,如果一种或另一种方式存在显着的性能差异,我可以采取任何一种方式。

4

3 回答 3

24

使用 Python,您可能会开发得更快,而使用 Java 肯定会运行得更快。

如果您想查看所有流行语言之间的一些非常准确的速度比较,请谷歌“基准游戏”,但如果我没记错的话,您所说的速度要快 3-5 倍。

也就是说,现在很少有东西是处理器绑定的,所以如果你觉得你可以用 Python 更好地开发,那就试试吧!


回复评论(java怎么能比Python快):

所有语言的处理方式都不同。Java 大约是 C 和 C++ 之后最快的(它可以与 java 一样快或快 5 倍,但似乎平均快 2 倍左右)。其余的要慢 2-5 倍以上。Python 是继 Java 之后速度更快的之一。我猜 C# 大约和 Java 一样快,或者可能更快,但是 benchmarksgame 只有 Mono(速度有点慢),因为它们不在 Windows 上运行。

这些声明中的大多数都是基于计算机语言基准测试游戏,这往往是相当公平的,因为每种语言的倡导者/专家都会调整以他们特定语言编写的测试,以确保代码具有良好的针对性。

例如,显示了使用 Java 与 c++ 进行的所有测试,您可以看到速度范围从大约等于 java 慢 3 倍(第一列在 1 和 3 之间),并且 java 使用更多的内存!

现在这个页面展示了 java vs python(从 Python 的角度来看)。因此,速度范围从 python 比 Java 慢 2 倍到 174 倍,但 python 在代码大小和内存使用方面通常优于 java。

这里还有一个有趣的点——分配大量内存的测试,Java 实际上在内存大小上的表现也明显优于 Python。我很确定java通常会因为VM的开销而丢失内存,但是一旦考虑到这一点,java可能比大多数(同样,除了C)更有效。

顺便说一下,这是 Python 3,另一个测试过的 Python 平台(只是称为 Python)的表现要差得多。

如果您真的想知道它是如何更快的,那么 VM 的智能非常惊人。它在运行代码后编译为机器语言,因此它知道最可能的代码路径是什么并针对它们进行优化。内存分配是一门艺术——在 OO 语言中非常有用。它可以执行一些非 VM 语言无法做到的惊人的运行时优化。当被迫时,它可以在非常小的内存占用中运行,并且是嵌入式设备和 C/C++ 的首选语言。

我在安捷伦的信号分析仪(想想昂贵的 o-scope)上工作,几乎所有的事情(除了采样)都是用 Java 完成的。这包括绘制包含跟踪 (AWT) 的屏幕并与控件交互。

目前我正在为所有未来的有线电视盒开发一个项目。该指南以及大多数其他应用程序都将使用 Java 编写。

为什么它不会比 Python 快?

于 2009-09-26T23:51:13.453 回答
15

Java 的动态性不如 Python,并且在其 VM 上投入了更多精力,使其成为一种更快的语言。Python 还受到其全局解释器锁的阻碍,这意味着它不能将单个进程的线程推送到不同的内核上。

这是否会产生重大影响取决于您打算做什么。我怀疑这两种语言都适合你。

于 2009-09-26T22:03:11.127 回答
14

您可以将 Hadoop mapreduce 转换编写为“流”或“自定义 jar”。如果您使用流式传输,您可以使用任何您喜欢的语言编写代码,包括 Python 或 C++。您的代码只会从 STDIN 读取并输出到 STDOUT。但是,在 0.21 之前的 hadoop 版本中,hadoop 流式传输过去只将文本而不是二进制流式传输到您的进程。因此,您的文件必须是文本文件,除非您自己进行一些时髦的编码转换。但现在似乎已经添加了一个补丁,现在允许使用二进制格式和 hadoop 流。

如果您使用“自定义 jar”(即您使用 hadoop 库在 Java 或 Scala 中编写了 mapreduce 代码),那么您将可以访问允许您从流式处理过程中输入和输出二进制(以二进制序列化)的函数(并将结果保存到磁盘)。所以未来的运行会快得多(取决于你的二进制格式比你的文本格式小多少)。

因此,如果您的 hadoop 作业将受 I/O 限制,那么“自定义 jar”方法会更快(因为正如之前的海报所示,Java 都更快,并且从磁盘读取也会更快)。

但你必须问问自己,你的时间有多宝贵。我发现自己使用 python 的效率要高得多,并且编写读取 STDIN 并写入 STDOUT 的 map-reduce 非常简单。所以我个人建议走 python 路线——即使你必须自己弄清楚二进制编码的东西。由于 hadoop 0.21 处理非 utf8 字节数组,并且由于有用于 python 的二进制(字节数组)替代方案(http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/ ),这表明 python 代码只比“自定义 jar”java 代码慢 25%,我肯定会走 python 路线。

于 2011-07-14T22:15:15.390 回答