Python 列表与 MySQL 查询性能对比
我有一个包含15000条记录的大列表,这些记录存储在MySQL数据库里,我需要多次从中选择一些项目。比如,我可能想要所有数字字段在1到10之间的记录。
在SQL中,这个操作很简单:
SELECT text FROM table WHERE number>=1 AND number<10;
如果我把整个表提取到一个Python列表中:
PyList = [[text1, number1], [text2, number2], ...]
我就可以通过遍历整个列表来提取我想要的那些文本值。
for item in PyList
if item[1] >=1 and item[1]<10:
result.append(item[0])
现在,关于这两种方法的性能问题是,我需要为一个滑动窗口进行操作。我想要获取1到10之间的记录,然后是2到11,3到12,……一直到14990到15000。对于这么大的列表,哪种方法更快呢?
我在Python中想到的一个改进是,先把Python列表按数字排序。当窗口移动时,我可以把result
中最小的值去掉,然后添加所有符合下一个条件的元素,以获得新的result
。我还会在PyList中跟踪索引,这样我就知道下一次迭代从哪里开始。这可以让我避免再次遍历整个列表。
我不知道如何加速MySQL对于非常相似的连续选择操作,也不清楚它内部是如何工作的,因此无法理解这两种方法之间的性能差异。
你会怎么实现这个呢?
4 个回答
没有实际的性能数据很难给出确切的答案,但我感觉使用带有绑定变量的SQL会更好(我不是MySQL专家,但在这种情况下,查询语法应该类似于 %varname)。
原因是你只在需要的时候才会返回数据(这样用户界面会提前变得更灵敏),而且你会依赖一个针对这种操作高度优化的系统。另一方面,获取一大块数据通常比获取小块数据要快,所以“完全使用Python”的方法可能也有它的优势。
不过,除非你遇到严重的性能问题,否则我还是建议使用SQL,因为这样写出来的代码会简单很多,更容易阅读和理解。
把数据直接加载到内存中肯定比执行大约15,000个查询要快得多。
我的建议是确保你的SQL查询能按照number
进行排序。如果数据已经排好序,你就可以使用bisect
这个标准库里的快速查找方法来找到索引。
简单来说,你只需要在数据库中为number
定义一个索引,这样数据库就能立刻生成结果集。而且,如果你需要的话,它还可以对这些结果进行一些计算。
数据库在处理这种查询时非常有效,我建议先让它完成这个任务,再考虑其他的做法。