2011-03-22 87 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而不是其他方式。