簡體   English   中英

什么時候在C中重寫Python模塊是否有意義?

[英]When Does It Make Sense To Rewrite A Python Module in C?

在我正在編寫的游戲中,我使用了我編寫的2D矢量類來處理對象的速度。 由於屏幕上有很多物體,因此每幀都會調用很多次,因此我可以在速度上增加任何增量。

它非常簡單,主要由相關數學函數的包裝器組成。 在C中重寫是非常簡單的,但是我不確定這樣做是否會產生任何顯着的差異,因為它實際上只是調用基礎數學函數,加法,乘法或除法。

所以,我的問題是在什么情況下在C中重寫是有意義的? 你會在哪里看到顯着的速度提升,在哪里可以看到合理的速度提升而無需重寫大量的程序?

如果你是矢量調整,首先嘗試numpy 如果你明智地使用numpy的矢量操作函數,你可能會在離C不遠的地方獲得速度。

除此之外,你的問題非常具有啟發性。 如果您的代碼太慢:

  1. 簡介 - 你有可能在Python中改進它
  2. 使用正確優化的基於C的庫(在您的情況下為numpy)
  3. 試試psyco
  4. 嘗試使用cython重寫部分
  5. 如果所有其他方法都失敗了,請在C中重寫

先測量然后優化

在優化之前之后,如果沒有對代碼進行計時,則不應使用C語言或任何其他語言優化任何內容:

  • 你聰明的優化實際上可能導致減速
  • 優化占總執行時間1%的東西永遠不會給你超過1%的性能

常見的方法是:

  1. 描述你的代碼
  2. 確定一個熱點
  3. 這個熱點的時間
  4. 優化它
  5. 再次為熱點計時,看看它是否更快。 如果它不是轉到3。

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

對於Linux下的剖析Python代碼,你可以使用pyprof2calltree其連同工作kcachegrind ,並且是完全真棒。

我在Linux上使用的一個很好的Profiler是pycallgraph - 但是,隨着程序變大,它開始創建更大的圖像,這些圖像更難以追蹤。 不過,我很確定你可以排除模塊。

常識是“概況”,“衡量”等。嗯 - 也許。 只需進入調試器並拍攝10張照片 如果它們的包裝代碼中有多個終止,那么它的成本大致超過10%,因此您應該考慮在C中重新執行它,以節省時間。 你可能會發現其他東西也花費不止於此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM