【问题标题】:How much of NumPy and SciPy is in C?C 语言中有多少 NumPy 和 SciPy?
【发布时间】:2010-12-22 00:04:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 枪战python代码(例如shootout.alioth.debian.org/u32/…)不使用numpy/scipy。
  • 不要忘记 Fortran。 Python 也能很好地与 Fortran 配合使用
  • @~unutbu 你会期望 regex-dna 程序使用 numpy,这有点令人费解。
  • 如果你仔细观察,你会发现一个“有趣的替代”Python 程序确实使用了 numpy shootout.alioth.debian.org/u32/…

标签: python performance numpy scipy scientific-computing


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

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

您最终想实现什么目标?如果您想要一种快速开发可读代码的方法,Python 是一个很好的选择,而且速度肯定足以让您第一次尝试解决您要解决的问题。

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

【讨论】:

  • 可以通过导航到特定程序来获得源代码。向下滚动到底部并单击“Python CPython”链接之一。一个例子:shootout.alioth.debian.org/u32/…
  • 暂时+1。下载 NumPy 源代码后,我可以确认它主要是用 Python 封装的 C。
  • “现在”我的意思是这是一个很好的答案,如果没有人对 Python、Java 和 C# 中的 C 互操作的不同成本进行良好比较,我会接受它。此外,我将听从您的建议,并以所有 3 种语言对应用程序的一部分进行原型制作。
  • "或者我错过了什么" 将您的Edit 放在顶部,这样每个人都会看到您的错误。出于好奇,您是否看过不止一页?
【解决方案2】:

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

【讨论】:

  • 您的链接似乎已损坏。也许你可以更换它?
  • 无缝断开的链接
【解决方案3】:

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

您的科学应用将运行一次。剩下的只是调试和开发,在 Python 上会更快。

【讨论】:

  • 真的 - 你应该试试看:使用 Python 交互式控制台中的 Python Numeric 创建一些矩阵,并使用它们“实时”进行一些操作。 -- 它为您提供了其他工具所无法超越的易用性和灵活性——它加速了任何开发,因为可以立即尝试新的想法和使用模式。 SciPy 交互式提示通常用作 MatLab 和其他昂贵(并且在某种程度上受限)的科学工具的替代品。
  • “你的科学应用程序将运行一次。剩下的只是调试和开发,在 Python 上可以更快。” ——通常我会同意。但是这个应用程序可以运行几天甚至几周,因此只要减少一点处理时间就可以节省大量的实时时间。它将运行不止一次。
【解决方案4】:

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 会让这更容易,但我对那个环境的经验为零。

【讨论】:

  • @DavidCournapeaud 将数组从 C# 传递到本机 dll 就像传递指针一样简单。事实上,没有复制数组(就像 Java 一样)。数组 作为(固定)引用传递,开销很小。
  • @DavidCournapeaud 请提供有关 JVM 和 CLR 有限制的参考资料。我用 python 和 java(以及其他)开发了科学软件,没有看到这样的问题,也没有比 numpy 慢。实际上,这似乎恰恰相反,因为例如线性代数库是任何体面库中的本机优化代码,并且在本机数值计算(循环、条件等)之外的数据处理归结为大多数编译语言(或除 python 之外的许多语言)中的 C 性能。跨度>
【解决方案5】:

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

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

【讨论】:

  • 即使是简单的基准测试也能更准确地证明这一立场
  • @vwvan 您希望看到哪个部分/语句得到基准的支持? “慢几倍”? “感觉更现代”?我已经强调了我回答的主观性。至少,在无法客观回答的问题上,对主观答案投反对票是合理的,这会使您的动机受到质疑。国际海事组织。
  • IMO 也是。回到中性值,因为它是一个很好的答案。
猜你喜欢
  • 2011-02-14
  • 1970-01-01
  • 2019-04-15
  • 2014-03-12
  • 1970-01-01
  • 2022-08-19
  • 2021-03-14
  • 2019-12-07
  • 2020-03-28
相关资源
最近更新 更多