python - 大类对性能有显着影响吗?

标签 python performance python-3.x optimization

我不久前构建了一个我经常使用的类Vector。随着时间的推移,我添加了越来越多有趣且有用的方法,例如标准化、投影等。类开始变得相当大,并且可能会变得更大。

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

我尝试在 Google 上寻找答案,但只找到 this它指的是 C++,但也许答案仍然适用?

否则我的问题是:是否存在任何重大的性能问题?我应该尝试让我的类更小并创建函数吗?使用大类还有其他我应该注意的重大缺点吗?

最佳答案

类的(代码)大小不会(直接)影响性能。

此外,只要您没有或预期没有性能问题,就不要专注于优化(大多数优化会导致更多工作,有时会导致更多不可读/不可维护的代码)。仅在需要时优化性能。最初,始终专注于小类/可读性/可维护性。尤其是最后一个似乎很重要,因为您定期添加功能。

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

如果有一些特定的向量类型,也许您可​​以使用继承来拆分您的类,或者您可以使用策略模式来执行不同类型的算法。但也许您只有数百个可以在向量上使用的函数;在本例中,使用辅助方法,传递向量并将每个方法放入最佳辅助类中。

例如标准化:

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 的工作原理非常相似。
  • 此外,堆栈需要填充向量。
  • 函数调用已完成。

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

通过在需要的地方优化算法本身,您可能可以在性能方面赢得更多胜利。

顺便说一句,

关于python - 大类对性能有显着影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38368720/

相关文章:

python - 如何修改以下 Python 脚本以忽略标签和标签内的属性?

python - 索引多维数组

Javascript 词法分析器/分词器(在 Python 中?)

c# - 有效地加入内存列表

python - 为什么response.content可以被读取两次并且无法解码为json

python - python 中针对周期性边界条件的有效符号函数

c# - 在 ASP.NET IIS 托管的 WCF 应用程序中偶尔调用需要 5 秒

python - 如何捕获 SQLAlchemy 上的特定数据库错误

python - 以小时为单位的日期时间分组(忽略哪一天)

python - 与等效的格式化选项相比,为什么 float.__repr__ 返回不同的表示?