从函数式语言访问numpy数组

5 投票
4 回答
948 浏览
提问于 2025-04-16 14:12

我主要使用的编程语言是Python。每当我需要对一个numpy数组进行一些计算量大的任务时,我通常会用scipy.weave.inline把C++代码连接进来,这样效果很好。

不过我怀疑,很多算法(比如机器学习相关的)其实可以用一种更简单的函数式编程语言(像Scheme或Haskell)来写。

我在想,是否可以直接从这些函数式编程语言访问numpy数组的数据(进行读写),而不需要使用C++呢?

4 个回答

1

如果你对使用什么平台没有特别的要求,可以看看Numpy在.NET和IronPython上运行的版本。这样的话,你就可以用F#这种函数式编程语言了。关于Numpy和Scipy在.NET上的一些细节可以在这里找到,还有一份CLI语言的列表。

4

目前没有一种统一的标准方法可以让Python调用Haskell。虽然确实有方法可以让Haskell被C语言调用,这意味着原则上没有什么障碍可以让Haskell被调用,只是还没有人做出特别简单的解决方案。

另一方面,如果你的数据结构不是特别庞大,把它们传给Haskell程序是很简单的,可以通过命令行或者使用像thrift这样的客户端-服务器模型。如果计算的成本是主要考虑的因素,那么这个成本可能会很小。

最后,从Haskell调用Python是非常简单的!经典的工具包是missingpy:http://hackage.haskell.org/package/MissingPy

还有一个更新的工具包叫做cpython,试图提供更全面的功能:http://hackage.haskell.org/package/cpython

从概念上讲,我想把你的Python应用放在Haskell中应该不会太难,反过来也是如此。

4

你可以考虑使用某种共享内存数组。这种实现方式可能是个不错的起点:https://bitbucket.org/cleemesser/numpy-sharedmem/src

这个实现是为了让多个Python进程共享数据,它使用了命名的共享内存,所以你应该可以从其他进程访问到相关的内存块。

我对Haskell不太熟悉,没法给你这方面的建议,但我想你可以在Haskell中使用指向共享内存缓冲区的指针,把它当作某种数组来用……

撰写回答