2009-09-11 117 views
1

我目前正在爲我正在編寫的C++庫編寫python綁定。該庫讀取一些二進制文件格式和閱讀速度非常重要。在優化庫的速度時,我注意到std :: vector(用在我正在讀的實例中)消耗了大量的處理時間,所以我用簡單的數組替換了新的[](無論這是好的/明智的事情可能是另一個問題)。從boost python返回一個c + +數組(指針)

現在我堅持如何給這些數組的python訪問的問題。似乎沒有內置到boost :: python中的解決方案(我至少沒有找到它)。

示例代碼來說明情況:

// Instance.cpp 
class Instance 
{ 
    int * data; 
    int dataLength; 
    Instance() 
    { 
     data = new int[10]; 
     dataLength = 10; 
    } 
}; 

// Class pythonBindings.cpp 
BOOST_PYTHON_MODULE(db) 
{ 
    class_<Instance>("Instance", init<>()) 
     .add_property("data", ........) 
    ; 
} 

我想我可以用它構建一個boost ::蟒蛇::名單出來時蟒蛇想訪問他們的陣列的包裝功能。由於我對boost :: python相當陌生,我想我應該問在我開始黑客入侵之前是否有任何好的,標準或內置的解決方案來解決這個問題。

那麼,你會如何推薦使用boost :: python包裝Instancedata數組?

+0

如果給它一個尺寸提示,向量不應該比數組慢。你確定你已經開啓了優化器嗎? (這是一個容易犯的錯誤。) – 2009-09-11 12:41:41

+0

好的一點,雖然檢查我的初始版本,我注意到,我沒有指定初始大小和使用push_back代替。我會看到它使用正確的std :: vector運行得有多快。謝謝! – 2009-09-11 12:49:48

+1

事實證明,更改爲c風格的數組是不成熟的:使用std :: vector結果是一樣快,只要您適當地使用reserve()和編譯器優化。 (不知道這應該是一個評論或對我自己的問題的答案) – 2009-12-11 11:24:32

回答

1

我會用代理類推薦一個wrap data和dataLength,並從Instance返回這個代理。在我們的項目中,我們使用這種方式將數據從我們的應用程序導出到python。

如果你想我可以給你幾個鏈接到我們的實現並解釋它是如何工作的。