【问题标题】:Is it faster and more memory efficient to manipulate data in Python or PostgreSQL?在 Python 或 PostgreSQL 中操作数据是否更快、内存效率更高?
【发布时间】:2020-10-03 20:16:42
【问题描述】:

假设我有一个包含 5-6 列和几百行的 PostgreSQL 表。使用 psycopg2 将 整个 表加载到我的 Python 程序中并使用 Python 选择我想要的行并根据需要对行进行排序会更有效吗?或者使用 SQL 来选择所需的行,对它们进行排序,然后只将那些特定的行加载到我的 Python 程序中会更有效吗?

“有效”是指:

  1. 内存使用情况。
  2. 速度。

此外,随着表格大小的增加,这些因素将如何开始变化?比如说,该表现在有几百万行?

【问题讨论】:

  • 虽然您的用例无需担心优化问题,但将整个数据库加载到内存中以执行数据库服务器可以轻松执行的操作的做法并不常见。

标签: python sql postgresql psycopg2


【解决方案1】:

在 PostgreSQL 中执行所有这些操作几乎总是会更快。这些数据库系统旨在为海量数据提供良好的扩展性,并针对其典型用例进行了高度优化。例如,他们不必从磁盘加载所有数据来执行最基本的过滤器[1]

即使不是这种情况,仅网络延迟/使用情况就足以平衡这一点,尤其是在您经常运行查询的情况下。

【讨论】:

    【解决方案2】:

    实际上,如果您将已经加载到内存中的数据与从数据库中检索到的数据进行比较,那么内存中的操作通常会更快。数据库有开销:

    • 它们位于同一服务器或不同服务器上的不同进程中,因此数据和命令需要在它们之间移动。
    • 查询需要解析和优化。
    • 数据库支持多个用户,因此其他工作可能会占用资源。
    • 数据库维护 ACID 属性和数据完整性,这会增加额外的开销。

    与每个查询的等效内存操作相比,前两个特别增加了开销。

    这并不意味着数据库没有优势,尤其是对于复杂的查询:

    • 他们实现了多种不同的算法,并有一个优化器来选择最佳算法。
    • 他们可以利用更多资源,尤其是通过并行运行。
    • 他们可以(有时)缓存结果以节省大量时间。

    数据库的优势不在于它们始终提供最佳性能。优点是它们通过简单的接口在非常广泛的请求中提供良好的性能(即使你不喜欢 SQL,我认为你需要承认它更简单、更简洁,并且比使用第三代语言编写代码更灵活)。

    此外,数据库通过 ACID 属性和其他支持数据完整性的机制来保护数据。

    【讨论】:

      猜你喜欢
      • 2020-06-18
      • 1970-01-01
      • 2019-11-22
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      相关资源
      最近更新 更多