2012-11-05 79 views
4

我正在研究如何將現有的混合Python/C++數字代碼庫轉變爲混合的Scala/C++(理想情況下大多數情況下是Scala)。我期望最大的問題是打包結構數組。例如,在C++中,我們有類型,如快速打包Scala結構數組

Array<Vector<double,3>> # analogous to double [][3] 
Array<Frame<Vector<double,3>>> # a bunch of translation,quaternion pairs 

這些可以Python和C++之間轉換來回不復制由於numpy的。 (1)爲每個結構創建(1)盒裝的Scala類型,例如Vector<double,3>和(2)類型化的薄層包裝在Array[Double]周圍,知道它應該是什麼結構,並根據需要創建/消費盒裝單身人士。

是否有任何現有的庫可以執行這樣的事情,或者爲結構化的數組結構實現任何替代方法?有沒有人對性能特徵可能會有什麼經驗,以及現有編譯器和JVM是否能夠優化至少非多邊形密封機箱中的盒子?

請注意,打包和漂亮打字不是可選的:如果沒有打包,我會很快打開內存,如果我只有Array [Double] C++的類型系統(不幸)獲勝。

回答

3

問題是真的,除了數字之外什麼都沒有。如果它只是一堆雙打,你可以在Scala中編寫一個包裝,但你不應該指望避免拳擊。相反,考慮寫可變包裝:

trait Vec3 { 
    def x: Double 
    def y: Double 
    def z: Double 
} 
class ArrayedVec3(array: Array[Double]) extends Vec3 { 
    private[this] var index = 0 
    def goto(i: Int) = { index = i*3; this } 
    def x = array(index) 
    def y = array(index+1) 
    def z = array(index+2) 
} 

你可以做ArrayedVec3實施Iterator,返回自己作爲next,或您想放心使用不效率的情況下各種其他的事情。

但問題是,如果您願意自己管理這些適配器的創建和移動,則不需要擔心拳擊。你只需創建一個「盒子」,然後它跳到你需要的地方。

如果你滿足於C++的約2倍的性能,並且目標是單線程使用,這應該是有用的。 (這對我來說很有用。)

+0

使用值類,你可以對這個技巧進行變化,並且非常接近C perf – bwawok