2010-01-19 49 views
3

在我編寫的遊戲中,我使用了我編寫的2D矢量類來處理對象的速度。由於屏幕上有很多物體,所以每幀都會被稱爲大量的時間,所以我可以通過增加速度來增加它。什麼時候在C中重寫Python模塊?

這很簡單,主要由相關數學函數的包裝組成。在C中重寫會非常微不足道,但我不確定這樣做是否會產生顯着差異,因爲它實際上只是調用底層的數學函數,添加,乘法或除法。

所以,我的問題是在什麼情況下重寫C?你會在哪裏看到明顯的速度提升,以及如何在不重寫大量程序的情況下看到合理的速度提升?

回答

14

如果你是矢量改寫(munging),給numpy一試第一。如果明智地利用numpy的矢量操作函數,你可能會得到距離C不遠的速度。

除此之外,你的問題是非常啓發式的。如果你的代碼是太慢:

  1. 簡介它 - 那麼你就可以在Python改善它
  2. 使用正確優化的基於C的庫(numpy的你的情況)
  3. 嘗試psyco
  4. cython
  5. 請嘗試重寫部分如果一切都失敗,重寫用C
+0

這是...什麼? –

+0

@多米尼克,編輯出來。謝謝 –

9

第一小節然後優化

+5

阿門。沒有基準的優化只是巫術。使用voodoo進行設計會導致軟件損壞。也就是說,發展一些關於在哪裏進行基準測試的直覺很重要,這就是這個問題所要求的。 –

+0

是的 - 我認爲其他擁有更多個人經驗的人會用numpy,boost:python,cython等。我只是認爲我會將點擊回家 –

+0

-1'如果你使用的機會是你距離C不遠numpy的矢量操作功能明智。 「不遠」實際上意味着:「不夠近,但有些令人滿意」。 –

0

一個很好的探查我在Linux上使用的是pycallgraph - 但是,你的程序變得更大,它開始創造更大的圖像這是很難追查。不過,我敢肯定你可以排除模塊。

0

常見的智慧是「簡介」,「措施」等等 - 也許。只需進入調試器並採取10 stackshots。如果它們中的不止一個在你的封裝代碼中終止,那麼它的成本大概是10%以上,所以你應該考慮在C中重新做它,以節省時間。有機會,你會發現其他的東西也更多的成本。

1

你不應該優化什麼,無論是在C或任何其他語言,沒有你們的優化後的時刻你的代碼前:

  • 你靈巧的優化實際上可能誘發慢下來
  • 優化的東西,需要的總執行時間的1%,也永遠不可能給你超過1%的性能

常見的做法是:

  1. 分析代碼
  2. 識別熱點
  3. 時間這個熱點
  4. 優化IT
  5. 時間的熱點再次,看看它的速度更快。如果它沒有轉到3.

如果你找不到熱點,這可能意味着你的應用已經被優化,或者你沒有使用好的算法來解決你的問題。在這兩種情況下,分析都有助於理解您的代碼的功能。

對於在Linux下分析python代碼,你可以使用pyprof2calltree,它與kcachegrind一起使用,而且非常棒。

相關問題