23

NumPy 和/或 SciPy 的一部分是用 C/C++ 编程的吗?

从 Python 调用 C 的开销与从 Java 和/或 C# 调用 C 的开销相比如何?

我只是想知道对于科学应用程序来说,Python 是否比 Java 或 C# 更好。

如果我看看枪战,Python 会以巨大的优势输掉比赛。但我想这是因为他们在这些基准测试中没有使用 3rd-party 库。

4

5 回答 5

19
  1. 我会质疑任何没有显示每个实现的来源的基准(或者我错过了什么)?完全有可能这些解决方案中的一个或两个都被错误地编码,这将导致对一个或两个语言的性能的不公平评估。 [编辑]哎呀,现在我看到了源代码。正如其他人指出的那样,它没有使用 NumPy/SciPy 库,因此这些基准不会帮助您做出决定。
  2. 我相信绝大多数 NumPy 和 SciPy 都是用 C 编写的,并用 Python 包装以便于使用。
  3. 对于特定应用程序的开销,这可能取决于您在任何这些语言中所做的事情。

我已经使用 Python 进行数据处理和分析几年了,所以我会说它肯定适合目的。

你想在一天结束时达到什么目标?如果你想要一种快速的方法来开发可读的代码,Python 是一个很好的选择,而且速度肯定足够快,可以第一次尝试解决你想要解决的问题。

为什么不对您的问题的一小部分进行一次 bash,并在开发时间和运行时间方面对结果进行基准测试?然后你可以根据一些相关数据做出客观的决定……或者至少我会这样做:-)

于 2009-12-01T12:39:25.913 回答
8

这里有一个更好的比较(不是基准,而是显示加速 Python 的方法)。NumPy 主要是用 C 编写的。Python 的主要优点是有很多方法可以容易地用 C (ctypes, swig,f2py) / C++ (boost.python, weave.inline, weave.blitz) 扩展你的代码/Fortran (f2py) - 甚至只是通过向 Python 添加类型注释以便可以将其处理为 C (cython)。我认为对于 C# 或 Java 来说,很多事情都不是那么容易的——至少在处理不同类型的数字数组时如此无缝地处理(尽管我猜支持者会争论,因为它们没有 Python 的性能损失,所以不需要至)。

于 2009-12-02T17:05:30.470 回答
5

NumPy 的大部分内容都是 C 语言,但大部分 C 代码是“样板”,用于处理 Python/C 接口的所有脏细节。对于 NumPy,我认为 C 与 Python 的比率约为 50/50 ATM。

我对基于 vm 的底层细节不太熟悉,但我相信由于 jvm 和 .clr 的限制,接口成本会更高。numpy 通常比类似环境更快的原因之一是内存表示以及数组如何在函数之间共享/传递。大多数环境(我相信还有 Matlab 和 R)使用 Copy-On-Write 在函数之间传递数组,而 NumPy 使用引用。但是在例如 JVM 中这样做会很困难(因为对如何使用指针等的限制)。这是可行的(存在用于 Jython 的 NumPy 的早期端口),但我不知道他们如何解决这个问题。也许 C++/Cli 会让这更容易,但我对那个环境的经验为零。

于 2010-02-02T08:00:41.747 回答
5

其中很多是用 C 或 fortran 编写的。您可以在 C 中重新编写热循环(或使用其中一种加速 python 的方法,我最喜欢 boost/weave),但这真的很重要吗?

您的科学应用程序将运行一次。剩下的只是调试和开发,这些在 Python 上会快得多。

于 2009-12-01T14:07:50.630 回答
0

它始终取决于您自己处理语言的能力,因此该语言能够生成快速代码。根据我的经验,numpy 比好的 .NET 实现慢好几倍。我希望 JAVA 也能很快。多年来,他们的优化 JIT 编译器有了显着改进,并产生了非常有效的指令。

另一方面,numpy 带有一种更易于使用的语法,这些语法与脚本语言相协调。但如果涉及到应用程序开发,这些优势往往会变成障碍,你会渴望类型安全和企业 IDE。此外,C# 的语法差距已经缩小。Java.NET存在越来越多的科学库。我个人倾向于 C#,因为它为多维数组提供了更好的语法,并且在某种程度上感觉更“现代”。但当然,这只是我个人的经验。

于 2012-02-06T17:58:08.123 回答