使用sqlite3与自定义表实现的优缺点

max*_*max 4 python sqlite performance

我注意到我的(纯Python)代码的很大一部分处理表.当然,我class Table支持基本功能,但我最终添加了越来越多的功能,如查询,验证,排序,索引等.

我想知道删除我是否是一个好主意class Table,并重构代码以使用我将在内存中实例化的常规关系数据库.

这是我到目前为止的想法:

  1. 查询和索引的性能会提高,但Python代码和单独的数据库进程之间的通信可能比Python函数之间的效率低.我认为这是太多的开销,所以我不得不使用Python附带的sqlite并且生活在同一个进程中.我希望这意味着它是纯粹的性能提升(以非标准SQL定义和sqlite的有限功能为代价).

  2. 使用SQL,我将获得比我自己想要的更强大的功能.看起来像一个明显的优势(即使使用sqlite).

  3. 我不需要调试我自己的表实现,但是SQL中的调试错误很难,因为我不能放置断点或者很容易打印出临时状态.我不知道如何判断代码可靠性和调试时间的整体影响.

  4. 代码将更容易阅读,因为我不会调用自己的自定义方法而是编写SQL(每个需要维护此代码的人都知道SQL).但是,处理数据库的Python代码可能比使用纯Python的代码更加丑陋和复杂class Table.同样,我不知道哪个更好平衡.

对上述内容的任何更正,或者我应该考虑的任何其他内容?

der*_*ert 5

SQLite不在单独的进程中运行.所以你实际上没有IPC的任何额外开销.但是,无论如何,IPC开销并不是那么大,特别是在UNIX套接字上.如果你需要多个编写器(多个进程/线程同时写入数据库),锁定开销可能更糟,MySQL或PostgreSQL的性能会更好,特别是如果在同一台机器上运行.所有这三个数据库支持的基本SQL都是相同的,因此基准测试并不那么痛苦.

您通常不必像在自己的实现上那样对SQL语句执行相同类型的调试.SQLite可以工作,并且已经很好地调试了.您不太可能必须调试"好的,该行存在,为什么数据库找不到它?" 并追踪索引更新中的错误.调试SQL与过程代码完全不同,实际上只有非常复杂的查询才会发生.

至于调试代码,你可以相当容易地集中你的SQL调用并添加跟踪来记录你正在运行的查询,你得到的结果等等.Python SQLite接口可能已经有了这个(不确定,我通常使用Perl) .将现有的Table类作为SQLite的包装器可能是最容易的.

我强烈建议不要重新发明轮子.SQLite将会有更少的错误,并为您节省大量时间.(你可能也想看看Firefox最近转向使用SQLite来存储历史记录等等,我认为这样做会有一些非常显着的加速.)

此外,SQLite优化良好的C实现可能比任何纯Python实现快得多.