【问题标题】:What is the performance overhead of using a Python ORM to query a DB of objects?使用 Python ORM 查询对象数据库的性能开销是多少?
【发布时间】:2015-07-12 03:05:29
【问题描述】:

我正在尝试自己学习 OOP,并且我正在尝试了解何时使用类。

如果我有一个名为 User 的类,它有几个不同的方法……等等。现在假设我的数据库中有 50,000 个用户要查询以进行报告。假设我想根据 User 类属性提取一半用户的 id。

这是否意味着该类的实例被创建了 50,000 次?如果是这样,与拥有一个执行查询的独立函数相比,这不会减慢速度吗?

【问题讨论】:

  • 这并不是关于对象本身,而是关于执行数据库查询时的开销(例如 ORM)。你真的是在问“如果使用 ORM 为每条记录创建一个对象实例,它的开销会不会太重?” 还有其他方法可以表示您的用户,例如 SQL 表/数据库/模式(sqlite/ MySQL/ Postgres/ 等),或 Django,或 No-SQL DB。最终你的代码想要做什么?您是否需要使用 Python 以及其他系统要求是什么(GUI?REST 接口?CPU 和内存需求)?如果你可以在一行 SQL 中做到这一点,那为什么不直接在 SQL 中完成呢?
  • python ORM overhead 上已有 59 个问题,可能这是重复的。还有很多现有的文章“我应该使用 ORM 吗?” 除非您告诉我们您的系统要求,否则只有您自己可以回答这个问题。

标签: python database class oop orm


【解决方案1】:

我不太确定我是否理解您的问题。但是,如果您问是否可以在不实例化(即创建实例)类的情况下使用类中的方法,那么答案是肯定的。你必须使用一个叫做“静态方法”的概念。

考虑这个类,Foo:

class Foo():

    def __init__(self):
        pass

    def say_hello(self):
        print('Hello from Foo!')

为了调用say_hello方法,我们必须做到以下几点:

f = Foo()
f.say_hello()

这会在控制台中打印Hello from Foo!

然而,为了让它工作,我们必须创建一个__init__ 方法,并且我们必须实例化 Foo。现在让我们使用带有@staticmethod 装饰器的静态方法重复这个实验。

class Foo():

    @staticmethod
    def say_hello():
        print('Hello from Foo!')


Foo.say_hello()

这会在控制台中打印Hello from Foo!,并且不需要创建任何对象。如您所见,不需要__init__(即构造函数)。

我希望这会有所帮助,如果我错过了您的问题的标记,我深表歉意。祝你好运!

【讨论】:

  • 这太棒了!太感谢了。我只是想弄清楚如何使用 OPP 的原则。我想弄清楚什么时候上课。是否应该有一个用户类和一个报告本身的类......等等。你的回答很有帮助。
猜你喜欢
  • 2021-04-25
  • 2010-09-05
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多