速度:将聚合值存储在数据库中还是使用 Jinja 进行计算?

2024-01-11

语言:Python

数据库:SQLite

使用:Flask、SQLAlchemy ORM


我的问题本身可能有点过分了,但我很好奇。

我在 SQLAlchemy 中有列Table其中包含我需要执行数学运算的某些值,以显示聚合值或计算值。

我们假设:

Column 1: 0

Column 2: 5

Column 3: 2

Column 4: 6

在 HTML 表中,我需要依赖这些值来计算并显示对它们进行算术运算的结果。

例子: (Column 1 + Column 2 + Column 3 / Column 6 ) * 100

我是否计算这些数字并将它们存储在 SQLite 数据库的新列中(使用 SQLAlchemy),或者使用即时计算它们Jinja2 http://jinja.pocoo.org/docs/dev/templates/#math?


对于任何优化问题,实际上都没有单一的校正解决方案。您必须通过测试找出最佳解决方案。您的案例是时间(速度)的优化,因此我们应该考虑内存(权衡)或数据的持久化和访问方式。以下是数据经过的层:

磁盘 -> SQLite 驱动程序 -> Python SQLite DBAPI -> SQLAlchemy -> Jinja

排除磁盘(因为您选择的数据库在处理物理存储优化方面并没有真正的技巧 - 毕竟它是单个文件)并排除 DBAPI 层(它与 SQLAlchemy 集成很好,并且您没有太多的SQLite 的 DBAPI 驱动程序之间的选择),以下是计算每一层中的列的可能方法:

  1. SQLite 驱动程序 - 您可以创建一个视图 https://sqlite.org/lang_createview.html在 SQLite 中计算列

    • 上层将视图视为表格
    • 可以更改上层但保持相同的定义
    • 如果不删除并重新创建视图,则无法动态修改计算
    • Cannot memoize https://en.wikipedia.org/wiki/Memoization计算尚未
    • 视图是只读的 - 围绕它构建 ORM 包装器毫无意义
    
    
    CREATE VIEW view_name (
        column_1,
        column_2,
        column_3_you_can_rename_columns_here,
        column_6,
        column_X)
    AS SELECT
        column_1,
        column_2,
        column_3,
        column_6,
        (column_1 + column_2 + column_3 / column_6) * 100.0
    FROM table_name
      
  2. SQLAlchemy - 计算列可以添加到您的表类定义中

    • 可用于将计算值保留/保存为数据库中的实际列的选项
    • 可以动态更改计算,就像在 Python 层中一样
    • 可以记住计算结果
    • 对于持久计算列,请参阅:https://stackoverflow.com/a/4284191/1027422 https://stackoverflow.com/a/4284191/1027422
    • 对于简单的仅 Python(不保存到数据库)计算列,请参阅:http://docs.sqlalchemy.org/en/latest/orm/mapped_sql_expr.html http://docs.sqlalchemy.org/en/latest/orm/mapped_sql_expr.html
    • 如何缓存或记忆计算,请参阅 lru_cache 部分https://docs.python.org/3/library/functools.html https://docs.python.org/3/library/functools.html
  3. Jinja - 也可以在 Jinja 中进行计算

    • 在这一层完成的计算不容易传递到前面的层 - 难以持久化到数据库
    • 可能不是最有效的

根据经验,通过在数据库级别进行预计算通常会获得最佳结果,因为计算是在数据一次性从磁盘提取到内存时完成的。但是,您对数据库的选择限制了您只能在 Python 级别进行优化。您需要使用以下方法来测试哪种方法最适合您的用例timeit https://docs.python.org/2/library/timeit.html.

除非您的数据(输入列)具有频繁重复的值,否则记忆可能对您没有帮助。但请注意过早的优化是万恶之源 http://slides.com/pythonph/pyconph-2015-root-of-all-evil#/25.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

速度:将聚合值存储在数据库中还是使用 Jinja 进行计算? 的相关文章

  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 使用 ASP.NET MVC 上传图像

    我需要上传图像作为 MVC 应用程序中创建操作的一部分 图像将存储在文件服务器中 数据库将包含该图像的路径 我计划使用以下标签来获取文件 gt
  • 如何将 2 个图像附加到布局底部

    我想附上2张图片 第一个位于左下角 其他位于右下角 但我希望这些图像在底部是核心的 这样如果我滚动页面 图像应该保留在同一位置 动态地 我成功地回答了我自己的问题 所以我特此为所有用户提供代码 它可以工作 所以拥有代码并享受 LinearL
  • Ionic 2 - Angular 2 http 标头未随请求一起发送

    我正在使用 Ionic 的最新测试版本 并且我已经为我的 api 服务器完成了 http post 方法 但标头不会随请求一起发送 我使用的代码如下 Ionic 版本 Beta 8 和 Angular 版本 rc 3 import Page
  • 将 UTF-8 字符串拆分为块

    我想将 UTF 8 字符串拆分为大小相等的块 我想出了一个解决方案 正是这样做的 现在我想简化它 如果可能的话 删除第一个收集调用 有办法做到吗 fn main let strings chars collect
  • Flask 中 return render_template 和 jinja 模板之间的区别

    我见过两种在 Flask 中路由 HTML 页面的方法 要么像这样声明一个名为 template 的变量 def home template jinja env get template hello form html return tem
  • 严格模式下不允许使用八进制文字

    我正在使用 Angular 2 当我在 SCSS 文件中使用它时 效果很好 text after content 00a0 00a0 然而 当我把它搬进去时 styles 表明 未捕获的语法错误 严格模式下不允许使用八进制文字 我知道代码s
  • 从数组 javascript 中删除元素(相反交集)

    昨天晚上我提出了这个问题从数组javascript中删除元素 https stackoverflow com questions 29711165 delete elements from array javascript但我错误地认为 我
  • 渲染与部分渲染和良率之间的差异

    我已经从 Rails 指南中读到了它 已经看过 Micheal Hartel 的书 现在又从 Rails View 的书中读到了它 但我仍然感到困惑 有一个 footer html erb文件 因此它是一个 部分 并且在它编写的代码中 所以
  • C 中指向二维数组的指针

    我知道有几个关于提供良好 和有效 解决方案的问题 但恕我直言 没有一个问题清楚地说明实现这一目标的最佳方法是什么 所以 假设我们有一些二维数组 int tab1 100 280 我们想要创建一个指向这个二维数组的指针 为了实现这一目标 我们
  • iOS - 将 NSDictionary 写入 Localized.strings

    这个问题是那个问题的连续体 iOS 我可以在运行时更改 localized strings 内容吗 https stackoverflow com questions 13625008 ios could i change the loca
  • 手工制作的强类型 ADO.net 数据表 - 它可以更干净吗?

    我最近遇到一个非常简单的类型化数据表 不使用 XSD 我丢失了作者的 URL 所以我不能相信他 但看起来有很多重复的代码 例如添加 删除 GetNewRow 方法 我尝试将重复的方法推入超类中 但由于 Employee 需要通用 因此出现了
  • 为什么 F# printfn 没有通过 Console.WriteLine 实现?

    我注意到使用 F printfn 时出现意外行为 它似乎将格式字符串分解为块 并为每次调用 printfn 多次调用 Console Write 我希望它格式化整个字符串 然后调用 Console WriteLine 一次 我注意到这一点是
  • 将 ASP.NET MVC ViewResult HTML 渲染为图像,无需第三方组件

    有没有办法将 ViewResult 或 PartialViewResult 渲染为图像 我尝试将 ViewResult 作为字符串获取 并且得到了一个包含 html 的字符串 但我需要将该 html 渲染为图像 如果可能的话 带样式和图像
  • Angular2 中的文件内容

    我正在编写一个小应用程序来执行一些 XML 文件聚合 用户删除一些具有相同结构的 XML 文件 编辑一些常见标签 然后我向他们返回一个 xml 其中包含元素列表中的所有所需数据 我正在使用 ng2 file upload 来进行文件删除 但
  • Java定义显式包私有修饰符[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 显然Java有一个Access级别包私有 https docs oracle com javase tutorial java javaOO a
  • 路径验证 - 我的正则表达式匹配格式错误的路径,但我不明白为什么

    这是我现在的表情 https regex101 com r BertHu 4 https regex101 com r BertHu 4 a z a z0 9 a z0 9 lt gt r n lt gt r n lt gt r n 我使用
  • IIS6中哪个w3wp.exe进程属于哪个应用程序池(使用powershell)

    到目前为止 我使用这个工具来判断哪个 w3wp 属于哪个应用程序池 c windows system32 cscript iisapp vbs 如何使用 Powershell 提取相同的信息 或者也许会得到更多信息丰富的结果 谢谢 这绝不是
  • 为什么 Scanf 在获取角色时工作很奇怪

    程序说明 我编写了一个程序 它接受用户无限号的字符输入 次数并打印输入的输入 这是程序 include
  • Pandas:使用合并单元格读取 Excel

    我有包含多个工作表的 Excel 文件 每个工作表看起来都有点像这样 但更长 Sample CD4 CD8 Day 1 8311 17 3 6 44 8312 13 6 3 50 8321 19 8 5 88 8322 13 5 4 09
  • 速度:将聚合值存储在数据库中还是使用 Jinja 进行计算?

    语言 Python 数据库 SQLite 使用 Flask SQLAlchemy ORM 我的问题本身可能有点过分了 但我很好奇 我在 SQLAlchemy 中有列Table其中包含我需要执行数学运算的某些值 以显示聚合值或计算值 我们假设