2010-08-02 81 views
0

我使用Boost.Python來擴展python程序功能。 Python腳本對原生模塊做了很多調用,所以我非常關心python-to-cpp類型轉換和數據編組的性能。Python擴展 - 性能

我決定嘗試通過Python C API本地公開方法。可能有人曾經嘗試過嗎?任何成功......至少在理論上?

我遇到的問題是如何將PyObject *轉換回類實例,PyArg_parse提供了O &選項,但是我所看到的僅僅是一個指向內存中C++對象的指針......我怎麼才能得到它功能?

if (PyArg_ParseTuple(args, "O", &pyTestClass)) { // how to get TestClass from pyTestClass ?? }

感謝

回答

1

我沒有試過Boost.Python的,但我用純粹的C以及Cython延長了Python。我推薦Cython;如果你足夠小心,你可以獲得與原始C相同的代碼,但是代碼少得多。

關於效率,它是相對的。這取決於你想要做什麼以及如何做。例如,我經常做的事情是在C中編寫一些圖像處理或矩陣操作的內部循環,並使用指向矩陣的指針作爲參數,由Python調用該函數。矩陣本身不會被複制,所以開銷很小。

+0

讓我們帶來一些抽象。我有一個簡單的函數: def sum(a,b):return a + b。現在讓我們想象它從C調用了幾十萬次,因此每微秒值得這裏。顯然這只是一個抽象,即我知道這樣做是沒有意義的。在現實生活中,我有一個更好的例子。所以我在這裏需要的是獲得調用之間的最小延遲,這意味着我需要優化實際函數總和的調用之間的時間間隔。 在這種情況下最好的方法是什麼? – Alex 2010-08-02 22:33:06

+0

所以你想從C調用Python?無論如何,Python和C之間的接口的開銷主要來自於必須將對象的東西(例如,在C中有一個int,在Python中有一個更大的整數)和處理引用計數。這是'快速',但如果要調用的函數非常簡單並且必須在緊密循環中調用,則可能會有太多開銷。爲了瞭解所涉及的工作,Cython可以選擇編寫一個html文件來顯示爲Cython/Python行生成的C代碼。這會讓您瞭解每項操作的成本。 – dimatura 2010-08-04 05:50:32