Java还是Python更适合数学?

21

我正在尝试编写一个基于数学的重型项目,每天需要多次解析约100MB以上的数据,因此我需要一种快速且相对易用的语言。我原本可以选择C语言,但是使用C语言完成大型项目非常困难,特别是在低级编程方面会遇到很多麻烦。因此,我在考虑使用Python或Java。两者都具备OO特性,所以我不介意选择哪一种。现在,以下是我选择Python的原因:

  • 非常容易使用的语言
  • 具有相当大量实用的库
  • 拥有易于使用的绘图库

以下是其缺点:

  • 运行速度不够快
  • 目前没有活跃的本地Python神经网络库
  • 要关闭Python代码的源代码,需要经历很多麻烦的过程
  • 在客户端计算机上部署Python代码很难处理,特别是当客户不熟悉计算机时。

接下来是选择Java的优点:

  • 非常庞大的库
  • 得到良好的支持
  • 易于部署
  • 运行速度相当快,甚至可以与C++相媲美
  • Encog神经网络库真的很活跃且非常棒
  • 网络支持非常好
  • 强类型

以下是Java的缺点:

  • 我找不到一个像matplotlib一样好的绘图库来使用
  • 没有内置对大整数的支持,这意味着需要额外的依赖(我指的是真正的大整数,不仅仅是math.BigInteger大小)
  • 与Python相比,文件IO有点尴尬
  • 没有太多类似Python那样用于数组操作或“使编程变得简单”的特性。

因此,我希望你们能告诉我该使用哪种语言。我对这两种语言都很熟悉。如果有其他语言的建议也可以提供。

编辑:哇!你们太快了!30分钟就收到了10个回复!


3
“REALLY big integers”是什么意思?java.math.BigInteger会随着你处理的数字增大而增大(但 Java 没有操作符重载,因此语法可能有些笨拙)。 - Luke Hutteman
2
你有没有考虑使用“真正的”计算机代数系统?它不一定非得是Mathematica(昂贵!),还有很多更便宜甚至免费的选择。 - Bart Kiers
只是好奇关于“我的意思是真正的大整数,而不仅仅是math.BigInteger大小”的评论。你为什么认为java.math.BigInteger数字做不到呢?在我看来,在你开始触及其极限之前,你已经会遇到内存问题了。 - Peter Štibraný
JFreeChart 似乎非常棒。我上次使用 bigintegers 已经很久了,我记得它们实际上并不是任意大小的。也许我错了,那时我还是个新手。关闭源代码几乎是必须的,我有足够的时间,但我希望尽快完成,我花费的时间越长,我就会承受更多的损失。 - Dhaivat Pandya
我决定采用两全其美的方案,使用Python收集数据并解析后,再通过Jython将其传递给Java类。非常感谢大家。 - Dhaivat Pandya
显示剩余5条评论
8个回答

19

Java通常运行速度更快(但不要把这当作绝对真理),但编写速度较慢。

Python则相反。由于像SciPyNumPy这样的库已经存在,它们是基于快速的C代码构建的,如果您更喜欢以编写代码的方式“更快”,我建议使用Python。除非在SciPy + NumPy中缺少应用程序的基本块,并且Java中存在这些基本块。


NumPy看起来是个不错的想法,我会去研究一下。 - Dhaivat Pandya
对于那些不是 SciPy 和 NumPy 内置的函数,您可以使用 weave(SciPy 的一部分)或 Cython 来加速它们。 - Justin Peel
NumPy和SciPy正在迅速成为科学/数学计算领域的标准。这绝对是值得拥有的技能。 - Adrian Petrescu
@darioo:请告诉我,应用程序的基本组成部分是什么? - cupcake
@user514892:任何作为标准库或现成的第三方库存在的东西。 - darioo

11

如何在JVM上利用多种语言,让你兼顾两全呢:

  • 使用Java编写性能密集的部分(或使用现有的优秀Java库)
  • 使用Jython编写用户界面/应用程序,并在需要时调用Java代码。

Jython有一个小问题需要注意。从Jython调用Java类非常简单方便,但是反过来却很麻烦。 - Matthew Schinckel
1
Jython会超越使用Java的意义,因为这主要是因为速度的提升。 - Dhaivat Pandya
在我看来,这是最权威的答案,我不会再去寻找其他的了。 - MattiaG
我不太明白你的意思,Dhaivat。你能再说一遍吗?据我所知,在JVM上,Jython的速度与本地Java代码相当,是这样吧? - Neil

3

NumPy通常能够强化Python的计算能力。在Python中,它是处理实数计算的事实标准。我在这个领域没有Java方面的真实经验,所以我不能为您回答这个问题。


2
部署Python代码在客户端的电脑上很难处理,特别是当客户很蠢时。我认为这也是Java的问题。
我找不到一个像matplotlib一样好用的Python绘图库。你试过JFreechart吗?http://www.jfree.org/jfreechart/ 此外,如果需要其他语言的建议,我会推荐Groovy,它看起来有点像Python,并且是一个与Java集成良好的JVM语言。
虽然你没有直接问,但我会推荐Apache Commons Math库用于Java数学计算。

看起来是个好主意,正是我所需要的... - Dhaivat Pandya
Groovy看起来有点像Python。是的,它是动态类型的,并支持列表,但除此之外,它的语法(对我来说)看起来90%以上像Java。 - Hovercraft Full Of Eels
每个人都有权发表自己的意见。 - Navi

1
如果这些是选择,那么Java应该更快地处理数学密集型工作。它是编译的(尽管是运行字节码)。
Exelian提到了NumPy。还有SciPy包。两者都值得一看,但似乎只在处理大量数组和向量处理时才能提高速度。当我尝试将它们与NLTK一起用于数学密集型例程时,我发现没有太多加速。
对于现今的数学密集型工作,我会使用C/C++或C#(个人更喜欢C#而不是Java,尽管这不应影响您的决定)。我的第一个雇主为我支付了使用Fortran进行几乎肯定比您想象的任何事情都更加数学密集型的工作。不要笑 - Fortran编译器是最适合重型计算机上的数学处理的。

1
为什么有人会嘲笑Fortran呢?它仍然是严肃科学计算的通用语言。NIST线性代数库无人能敌。 - duffymo
1
总的来说,编译器和库的组合可能是重型设备中最好的选择,然而大多数开发人员(即使是老一辈的)似乎并不知道这一点,并很快地将其作为古老的东西而轻易地排除在现代世界之外。 - winwaed

0

对你来说,什么更重要?

如果是快速应用程序开发,我发现 Python 比 Java 更容易编码 - 而且我只是在学习 Python,而我已经在 Java 上编码了多年。

如果是应用程序速度和重复使用现有代码的能力,那么你可能应该坚持使用 Java。它相当快,并且许多研究目前使用 Java 作为他们的首选语言。


0

看起来Java可以非常快:http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/
另一方面,Python非常适合做数学运算,如果使用正确的习惯/模块/内置函数,还有很大的性能提升空间。

编辑:其他语言的建议:Haskell。它非常高级;以“低级风格”编写可以非常快(可以与C相当),如果能充分利用其多线程功能,效果会更好。然而,经验告诉我们,在项目需要时学习使用新工具从来不是一个好主意。


Haskell 看起来很有趣,有没有好的函数式编程教程可以推荐?尤其是数学相关的教程会更好。 - Dhaivat Pandya
@Dhaivat 这篇文章写得非常好,适合初学者阅读:http://learnyouahaskell.com/ - MattiaG
此外,更多性能比较请参考:http://www.lix.polytechnique.fr/~kaustuv/expo/incr_uarray/#first-ocaml - MattiaG

0

Apache Commons Math 接手了 JAMA 的工作。它们非常适合科学计算。

Python 也是如此 - NumPy 和 SciPy 非常出色。我还喜欢 Python 是面向对象和函数式编程的混合体这一事实。函数式编程对于数值方法非常方便。

我建议使用你最熟悉的那个,但如果两者不分伯仲,我可能会倾向于选择 Python。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接