Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中实现数据库样式表_Python_Performance_Data Structures_Implementation - Fatal编程技术网

如何在Python中实现数据库样式表

如何在Python中实现数据库样式表,python,performance,data-structures,implementation,Python,Performance,Data Structures,Implementation,我正在实现一个类似于典型数据库表的类: 具有命名列和未命名行 有一个主键,我可以通过它引用行 支持按主键和列标题进行检索和分配 可以要求为任何列添加唯一或非唯一索引,以便快速检索该列中具有给定值的行(或行集) 行的删除速度很快,实现为“软删除”:该行在物理上保留,但标记为删除,并且不会在任何后续检索操作中显示 列的添加速度很快 很少添加行 列很少被删除 我决定直接实现该类,而不是在sqlite周围使用包装器 使用什么样的数据结构比较好 举个例子,我考虑的一种方法是使用字典。其键是表的主键列

我正在实现一个类似于典型数据库表的类:

  • 具有命名列和未命名行
  • 有一个主键,我可以通过它引用行
  • 支持按主键和列标题进行检索和分配
  • 可以要求为任何列添加唯一或非唯一索引,以便快速检索该列中具有给定值的行(或行集)
  • 行的删除速度很快,实现为“软删除”:该行在物理上保留,但标记为删除,并且不会在任何后续检索操作中显示
  • 列的添加速度很快
  • 很少添加行
  • 列很少被删除
我决定直接实现该类,而不是在sqlite周围使用包装器

使用什么样的数据结构比较好


举个例子,我考虑的一种方法是使用字典。其键是表的主键列中的值;其值是通过以下方式之一实现的行:

  • 作为列表。列编号映射到列标题(使用一个方向的列表和另一个方向的映射)。在这里,检索操作首先将列标题转换为列编号,然后在列表中查找相应的元素

  • 作为字典。列标题是这本词典的关键

  • 不确定两者的利弊


    我想编写自己的代码的原因是:

    • 我需要跟踪行删除。也就是说,在任何时候,我都希望能够报告删除了哪些行以及出于什么“原因”(将“原因”传递给我的delete方法)
    • 我需要在索引期间进行一些报告(例如,在构建非唯一索引时,我希望检查某些条件,并报告是否违反了这些条件)

    • 我会考虑用键或元组来构造字典。例如:
      my_dict((“col_2”,“row_24”)
      将为您获取此元素。从这里开始,编写“get_col”和“get_row”方法,以及前面两个方法中的“get_row_slice”和“get_col_slice”来访问您的方法将非常容易(如果对于非常大的数据库来说不是非常快的话)

      像那样使用一本完整的字典有两个好处。1) 获取单个元素的速度将比您提出的两种方法更快;2) 如果您想在列中包含不同数量的元素(或缺少的元素),这将使它非常简单,而且内存效率也非常高

      只是想一想:)我很好奇,看看人们会推荐什么样的套餐


      欢呼[

      你可能想考虑创建一个类,它使用了在引擎盖下的内存内SQLite表:

      import sqlite3
      
      class MyTable(object):
          def __init__(self):
              self.conn=sqlite3.connect(':memory:')
              self.cursor=self.conn.cursor()
              sql='''\
                  CREATE TABLE foo ...
              '''
              self.execute(sql)
          def execute(self,sql,args):
              self.cursor.execute(sql,args)
          def delete(self,id,reason):
              sql='UPDATE table SET softdelete = 1, reason = %s where tableid = %s'
              self.cursor.execute(sql,(reason,id,))
          def verify(self):
              # Check that certain conditions are true
              # Report (or raise exception?) if violated
          def build_index(self):
              self.verify()
              ... 
      
      软删除可以通过使用
      softdelete
      列(bool类型)来实现。 类似地,您可以有一个列来存储删除原因。 取消删除只需更新行并更改
      softdelete
      值。 使用SQL条件
      WHERE softdelete!=1

      您可以编写
      verify
      方法来验证数据上的条件是否满足。您可以从
      build\u index
      方法中调用该方法

      另一种选择是使用numpy结构的掩码数组


      很难说什么是最快的。也许唯一确定的方法是为每个项目编写代码,并使用timeit在真实数据上进行基准测试。

      您真的应该使用SQLite

      对于第一个原因(跟踪删除原因),您可以通过在删除时将行“移动”到第二个表来轻松实现这一点。可以在该表或您可以加入的其他表的其他列中跟踪原因。如果不总是需要删除原因,那么您甚至可以在源表上使用触发器来复制要删除的行,和/或使用用户定义的函数来获取删除原因


      索引原因在某种程度上被约束等所覆盖,但如果没有更多细节,我无法直接解决它。

      为什么要这样做,而不是使用现有的DBMS?特别是,为什么不在
      sqlite
      周围使用包装器?@delnan@katrielex:刚刚编辑了我的问题,给出了几个原因。也许有一种使用sqlite包装器的方法可以做到这一点?很有趣。对我来说,这似乎也更快,但我不确定:可以想象,获取列表元素的速度可能与计算元组而不是单个值的哈希所需的额外工作一样快。顺便说一句,我只关心时间,而不是内存和效率。那么,当桌子变大时,字典肯定会更快。在100万个元素的列表中,在找到正确的元素之前,平均需要搜索50万个元素。对于哈希表,即字典,您最多需要搜索20个元素才能找到正确的元素。干杯我同意,但当我说“list”时,我的意思是使用字典将列名转换为列表索引,以便进行O(1)访问。刚开始使用字典比较容易。我喜欢
      softdelete
      专栏的想法。我认为我不能使用
      verify
      方法,因为在建立索引时(逐行)检查了我的条件;但是如果我可以依赖sqlite而不是自定义类,那么付出的代价可能很小。我也很有兴趣了解《面具达瑞》,以前从未听说过。