【问题标题】:access numpy array from a functional language从函数式语言访问 numpy 数组
【发布时间】:2011-03-22 14:08:31
【问题描述】:

我的主要语言是 Python。通常,当我需要在 numpy 数组上执行一些 cpu 繁重的任务时,我会使用 scipy.weave.inline 来连接 c++ 并取得很好的效果。

我怀疑许多算法(机器学习的东西)可以用函数式语言(scheme、haskell...)更简单地编写。

我在想。是否可以从函数式语言访问 numpy 数组数据(读取和写入),而不必使用 c++?

【问题讨论】:

  • 我的意思是在内存中访问它,但是对于小型数组/繁重的处理,将它从 python 保存到磁盘(或 /dev/shm)可能就足够了,在 haskell 中加载它,处理,保存到磁盘,从 python 加载。
  • @janto - 对不起,我在你回复的同时删除了我的评论......回想起来,我认为你的意思是在内存中访问它似乎很明显。无论如何,正如我在下面的回答中详细说明的那样,一种解决方案是为 numpy 数组使用共享内存缓冲区,然后从你的 haskell(或其他)进程中访问它......这确实增加了一层与编织等相比,复杂性...
  • @janto:你看过各种python机器学习包了吗?可能有快速的解决方案或模板可以在 python 中编写您自己的。
  • 顺便说一句,谷歌搜索似乎表明 haskell 可以通过 FFI 与 C 库进行交互,反之亦然:haskell.org/haskellwiki/FFI_Introduction(我不是 haskell 人,如果这是,请原谅我完全脱离基地!)。如果您可以从 C 调用 haskell 例程,那么您可以通过 ctypes、cython、weave 等从 python 调用它......这可能会很痛苦,但听起来可能。这“只是”处理存储 numpy 数组的内存缓冲区的问题......
  • @JashAdel 我正在研究的算法不太流行(与支持向量机之类的东西相比),研究仍在进行中。因此,我所做的事情甚至没有很多 C 实现(信念传播、伪似然)。

标签: python haskell functional-programming numpy scipy


【解决方案1】:

您可能会考虑使用某种共享内存数组。这个实现可能是一个很好的起点:https://bitbucket.org/cleemesser/numpy-sharedmem/src

此实现旨在在 python 进程之间共享,但它使用命名共享内存来执行此操作,因此您应该能够从任何其他进程访问相关的内存块。

我对 haskell 不够熟悉,无法在这方面给你任何建议,但我假设你可以在 haskell 中使用指向共享内存缓冲区的指针作为某种数组...

【讨论】:

  • 这可能是最简单的方法。创建一个在共享内存缓冲区上运行的 Haskell 进程相对容易。 vector 包中的模块Data.Vector.Storable 将为一维数组提供此功能(对于更高维度,也许 hmatrix 会起作用)。
【解决方案2】:

目前没有从 Python 调用 Haskell 的单一标准方法。当然有很多方法可以从 C 中调用 haskell,这意味着调用 Haskell 原则上没有障碍——根本没有做任何工作来使这变得特别容易。

另一方面,如果您的数据结构本身并不庞大,将它们序列化到 Haskell 程序(通过命令行,或使用客户端-服务器模型,例如 thrift)是非常简单的,如果计算成本是最重要的,成本可能是最小的。

最后,从 Haskell 调用 Python 非常容易!这个的经典包是missingpy:http://hackage.haskell.org/package/MissingPy

还有一个名为 cpython 的更新包,它试图更全面:http://hackage.haskell.org/package/cpython

从概念上讲,我想,在 Haskell 中托管您的 Python 应用程序而不是其他方式应该不是很难。

【讨论】:

    【解决方案3】:

    如果您对使用的平台没有要求,您可以查看在 CLI 上运行的 .NET 和 IronPython 的 Numpy 实现。例如,有了这个,您就可以将 F# 用作函数式语言。 .NET 上 Numpy 和 Scipy 的一些详细信息是 hereCLI languages 的列表。

    【讨论】:

      【解决方案4】:

      我无法想象尝试通过haskell 或scheme 使用numpy 会比编写函数式python 更容易。如果您想要功能更丰富的 python,请尝试使用 itertoolsfunctools

      【讨论】:

      • 很抱歉投了反对票,我理解这种情绪,但这是一个有效的问题,无论您是否同意这个动机,都应该得到一个实际的答案。像这样的东西属于评论。
      • 问题是速度。 Python 对于我运行的算法类型来说太慢了。我的印象是我可以在 Haskell 中编写一个函数,并让它运行得与 c++ 一样快,甚至更快。
      • 如果有人想出一种在 haskell 或方案中访问 numpy 的方法,它比优化 python 代码或只是切换到不同的编程语言更实用,我会感到震惊。我意识到它并没有直接回答这个问题,但我的回答仍然是“你采取了错误的方法。”
      • 好吧,不幸的是,Python(无 cython 或 PyPy)无法与 c++ 代码竞争。完全切换到另一种语言也行不通。我有很多数据需要处理,Python 非常适合(胶水语言等)。
      • 我想我没有把我的情况说清楚。我已经有 c++ 代码,并且已经通过 scipy.weave 从 python 调用它。它足够快并且与我的 numpy 数组接口。我只是想知道是否可以使用函数式语言而不是 c++ 来做同样的事情,因为我怀疑算法在函数式语言中会更清晰。如有任何混淆,请见谅。
      猜你喜欢
      • 2015-01-30
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多