[英]Python list vs. MySQL Select performance
我在MySQL表中有一个包含15k条目的大型列表,我需要从中多次选择一些项。 例如,我可能希望所有条目的数字字段在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中的索引,以便在下一次迭代中知道从何处开始。 这样可以避免我再次遍历整个列表。
我不知道如何加快非常相似的连续Select的MySQL,也不知道它在内部如何理解两种方法之间的性能差异。
您将如何实施?
只需在数据库中定义number
索引,数据库即可立即生成结果集。 另外,如果这是您的下一步,它也可以对这些集合进行一些计算。
数据库实际上很擅长此类查询,在尝试其他方法之前,我会让它完成其工作。
将数据拉入内存肯定比运行约15,000个查询要快得多。
我的建议是确保SQL查询按number
对数据进行排序。 如果对数据进行了排序,则可以使用bisect
标准库模块中的快速查找方法来查找索引。
将所有数据读入Python(从您提到的数字应该方便地放入内存中),按您所说的pylist
入变量pylist
中,然后准备如下的辅助数据结构:
import collections
d = collections.defaultdict(list)
for text, number in pylist:
d[number].append(text)
现在,要获取包含在low
包含和high
排除之间的数字的所有文本,
def slidingwindow(d, low, high):
result = []
for x in xrange(low, high):
result.extend(d.get(x, ()))
return result
没有实际的性能很难回答,但是我的直觉是最好使用带有绑定变量的SQL(我不是MySQL专家,但是在这种情况下,查询语法应该类似于%varname)。
原因是您仅在需要时才返回数据(因此用户界面会提前做出响应),并且您将依赖针对此类操作进行高度优化的系统。 另一方面,检索较大的数据通常比检索较小的数据更快,因此“完整python”方法可能具有优势。
但是,除非遇到严重的性能问题,否则我仍然会坚持使用SQL,因为这样做会使阅读和理解的代码简单得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.