一个大班级是否会影响绩效?

时间:2016-07-14 08:05:00

标签: python performance python-3.x optimization

前段时间我构建了一个类 Vector ,我经常使用它。随着时间的推移,我正在添加越来越多有趣且有用的方法,例如normalize,projection et cetera。课程开始变得很大,可能会变得更大。

由于我正在使用这个类来计算1000多个对象的位置和移动,并且我每1/60秒创建一个新实例,我开始担心性能和/或内存可能是个问题。

我曾尝试在Google上寻找答案,但只找到了引用C ++的this,但答案仍然适用?

否则我的问题是:是否有任何重大的性能问题?我应该尝试让我的班级变小,而不是创建函数吗?使用大型课程还有其他重要缺点我应该注意吗?

1 个答案:

答案 0 :(得分:2)

类的(代码)大小没有(直接)性能后果。

此外,只要您没有或期望遇到性能问题,就不要专注于优化(主要是优化会导致更多工作,有时更难以阅读/维护代码)。仅在需要时优化性能。最初,始终专注于小班/可读性/可维护性。特别是最后一个看起来很重要,因为你定期添加功能。

您已经提供了一些功能区域,例如投影,标准化。也许你可以将它们移动到其他类或辅助类,如果它们不需要任何数据的话。

也许你可以使用继承来分割你的类,如果有一些特定的矢量类型,或者你可以使用策略模式来执行不同类型的算法。但也许你只有几百个可以在矢量上使用的函数;在这种情况下,使用辅助方法,使用它传递向量,并将每个方法放在最好的帮助程序类中。

例如规范化:

public abstract VectorNormalization
{
     public void Normalize(Vector v)
     {
        .. do something with v
     }

     public void NormalizeDifferent(Vector v)
     ...
}

你可以通过

来调用它
Vector v = Vector(3,4);
VectorNormalization.Normalize(v);

关于表现。要调用Normalize函数:

  • 通常,帮助程序类在内部使用所谓的v表。要调用辅助方法,编译器需要将v-table start添加到函数并调用它,这是一个非常微不足道的性能损失。我认为C ++和Python的工作方式非常相似。
  • 此外,堆栈需要使用向量填充。
  • 进行了函数调用。

只有第一个会被改变,因为在一个大班级中也需要第二和第三。

通过在需要的地方优化算法,您可以更好地赢得性能。

顺便说一句,