2011-03-22 85 views
5

我的主要语言是Python。通常,当我需要在numpy数组上执行一些cpu繁重的任务时,我使用scipy.weave.inline来连接C++以获得很好的结果。我怀疑许多算法(机器学习的东西)可以用函数式语言(scheme,haskell ...)来写得更简单。从功能语言访问numpy数组

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

+0

我的意思是在内存中访问它,但对于小型数组/重处理,它可能足以将其从python保存到磁盘(或/ dev/shm),将其加载到haskell中,处理,保存到磁盘,从python加载。 – janto 2011-03-22 14:47:12

+0

@janto - 对不起,我删除了我的评论,你同时回复了......回想起来,我觉得你显然意味着在内存中访问它。无论如何,正如我在下面的答案中详细阐述的那样,一种解决方案是为numpy数组使用共享内存缓冲区,然后从haskell(或其他)过程中访问它......这确实增加了一层额外的复杂性比编织等,虽然... – 2011-03-22 14:54:20

+0

@janto:你看过各种python机器学习包?有可能是快速的解决方案或模板来编写你自己已经可以在Python中使用。 – JoshAdel 2011-03-22 15:00:17

回答

4

你可能会看看使用某种共享内存数组。此实现可能将是一个良好的开端:https://bitbucket.org/cleemesser/numpy-sharedmem/src

本实施旨在蟒蛇进程间共享,但它使用命名的共享内存来做到这一点,所以你应该能够从访问的内存相关的块任何其他过程。

我不是哈斯克尔给你在那边的任何意见不够熟悉,但我相信你可以使用一个指向共享内存缓冲区作为某种哈斯克尔的数组...

+3

这可能是最简单的方法。创建一个在共享内存缓冲区上运行的Haskell进程相对容易。矢量包中的模块'Data.Vector.Storable'将为1D数组提供此功能(对于更高维数,可能hmatrix会起作用)。 – 2011-03-22 17:51:32

-2

我无法想象试图通过haskell或scheme来使用numpy会比编写函数式python容易。如果你想要一个功能更强大的python,尝试使用itertoolsfunctools

+1

对不起,我理解情绪,但这是一个有效的问题,值得一个实际的答案,无论你是否同意动机。像这样的讨厌属于评论。 – sclv 2011-03-22 14:26:03

+1

问题在于速度。 Python对于我运行的算法类型来说太慢了。我觉得我可以在Haskell中编写一个函数,并且它的运行速度要比C++快,甚至更快。 – janto 2011-03-22 14:26:13

+1

如果有人想出一种方法来访问haskell中的numpy或者方案,它比优化Python代码或只是切换到其他编程语言更具实用性,那么我会感到震惊。我意识到它不直接回答这个问题,但我的答案仍然是“你采取了错误的做法。” – tkerwin 2011-03-22 14:46:22

1

在如果您对平台没有要求,您可以查看在CLI上运行的.NET和IronPython的Numpy实现。有了这个,你就可以使用F#作为一个功能语言。 Numpy和Scipy on .NET的一些细节是hereCLI languages的列表。

+0

我是Linux用户,但谢谢。听起来可以。 – janto 2011-03-22 15:38:08

4

目前还没有一种标准的从Python调用Haskell的方法。从C调用Haskell肯定有方法,这意味着调用Haskell原则上没有任何障碍 - 这项工作根本就没有做到让这个特别简单。另一方面,如果你的数据结构本身并不是很大,那么把它们序列化成一个Haskell程序(通​​过命令行或者使用一个客户机 - 服务器模型,比如节俭)非常简单,如果计算成本足以支配,成本可能很小。

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

还有一个试图更加全面更新的包称为CPython的:http://hackage.haskell.org/package/cpython

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