2011-11-09 92 views
14

我有一些用C寫的遊戲項目的函數。這些函數被調用了很多(大約每秒2000-4000次)。這些函數用C語言編寫,用於原始速度。ctypes vs C擴展

現在,將這些函數包含到Python中的最簡單方法是使用​​。另一種方法是圍繞這些函數向Python寫一個C擴展(這需要相當多的額外工作)。所以我想知道,不包括DLL的初始加載,​​的開銷有多大?我使用Python 2.7(標準的CPython版本),我不想使用像Cython這樣的外部庫。

我知道這個問題之前已經被問過了,但我還沒有看到關於這兩個選項之間性能比較的很多信息。

+0

那麼,PyPy的JIT可以爲一個或兩個版本的'ctypes'調用產生相當不錯的代碼。你可能想嘗試一下。我不會將此作爲答案發布,因爲我手頭沒有硬數據,目前尚不清楚是否可以爲您提供切換解釋器。 – delnan

+0

我希望開銷類似。 –

+0

@Delnan:這是我要發佈的遊戲 - 也是針對linux的。我不能要求我的用戶安裝PyPy。 – orlp

回答

10

我比較了C擴展與ctypes包裝的性能。在我的特殊測試中,差異約爲250倍。 C庫中有多個調用,所以ctypes包裝器也在執行Python代碼。 C庫的運行時間非常短,這使得Python代碼的額外開銷更加顯着。所以這個比例可能會有所不同,但對我來說意義重大。

+5

那麼哪一個是250x慢? – delnan

+1

@delnan:從他的回答中,我可以看到ctypes包裝比較慢。 – orlp

6

直接C編碼接口可能要快得多。瓶頸是從Python到C的接口,編組參數和結果可能涉及複製字符串或將Python列表轉換爲C數組。如果你有一個循環可以進行數百次這樣的調用,並且每次調用都不需要分別編組一些數據,那麼你所要做的就是在C中重新編碼循環,並且可以大幅減少瓶頸。 ctypes不會給你這個選擇:你所能做的就是直接調用現有的函數。

當然,這一切都取決於您所調用的函數以及您傳遞的數據類型。這可能是你不能減少開銷,在這種情況下,我仍然認爲ctypes會變慢,但可能並不顯着。

你最好的辦法是把你的代碼樣本寫在每個方面,並進行基準測試。否則,只有太多的變量才能給出明確的答案。

+0

我們所討論的數據是一個位掩碼(用於碰撞),我準備好了一個C實現,在Python代碼中傳遞的數據是布爾值,座標和新的python位掩碼類(它只包含一個指向實際數據本身的指針,它存在於C代碼中) – orlp