什么时候在C中重写Python模块是否有意义?

时间:2010-01-19 19:19:29

标签: python c optimization

在我正在编写的游戏中,我使用了我编写的2D矢量类来处理对象的速度。由于屏幕上有很多物体,因此每帧都会调用很多次,因此我可以在速度上增加任何效果。

这很简单,主要由相关数学函数的包装器组成。在C中重写是非常简单的,但我不确定这样做是否会产生任何显着的差异,因为它实际上只是调用基础数学函数,加法,乘法或除法。

所以,我的问题是在什么情况下在C中重写是有意义的?你会在哪里看到显着的速度提升,你在哪里可以看到合理的速度提升而无需重写大量的程序?

5 个答案:

答案 0 :(得分:14)

如果您正在进行矢量调整,请首先尝试numpy。如果你明智地使用numpy的矢量操作函数,你可能会在距离C不远的地方获得速度。

除此之外,你的问题非常具有启发性。如果你的代码太慢了:

  1. 描述它 - 你有可能在Python中改进它
  2. 使用正确优化的基于C的库(在您的情况下为numpy)
  3. 尝试psyco
  4. 尝试使用cython
  5. 重写部分
  6. 如果所有其他方法都失败了,请在C
  7. 中重写

答案 1 :(得分:9)

首先测量然后优化

答案 2 :(得分:1)

在优化之后,如果没有在之前计算代码,则不应使用C或任何其他语言优化任何内容:

  • 你聪明的优化实际上可能导致减速
  • 优化占总执行时间1%的内容将永远不会超过1%的性能

常见的方法是:

  1. 描述您的代码
  2. 识别热点
  3. 这个热点的时间
  4. 优化它
  5. 再次为热点计时,看看它是否更快。如果它不是转到3。
  6. 如果找不到热点,可能意味着您的应用已经过优化,或者您没有针对您的问题使用好的算法。在这两种情况下,分析有助于理解代码的作用。

    为了在Linux下分析python代码,你可以使用pyprof2calltreekcachegrind一起使用,并且非常棒。

答案 3 :(得分:0)

我在Linux上使用的一个不错的Profiler是pycallgraph - 然而,随着程序变大,它开始创建更大的图像,这些图像更难以追踪。我很确定你可以排除模块。

答案 4 :(得分:0)

常识是“概况”,“衡量”等等。好吧 - 也许吧。只需进入调试器并获取10 stackshots。如果它们的包装代码中有多个终止,那么它的成本大致超过10%,因此您应该考虑在C中重新执行它,以节省时间。你可能会发现其他的东西也花费不止于此。