【发布时间】:2021-06-07 09:22:55
【问题描述】:
所以我一直在努力寻找最好的解决方案,但似乎一切都有其缺点。
对于我的项目,主要代码(在 python 中)需要尽可能快地访问数据。
数据由 3 个参数 (h1, h2, q) 组成,每个参数可以取一定范围内的每个值,它们是键和 2 个参数 (n, p),它们是基于 3 个键计算的。
由于在主程序中计算它们花费的时间太长,我想预先计算所有可能的选项并在我的主程序中访问它们。
我的第一个解决方案是构建一个包含 2 个计算值的数组的三倍嵌套字典。 有了这个我有两个问题:
1.) 我真的没有找到一个很好的解决方案来从我的 main 方法中访问数据(它太大了,无法将其作为变量复制粘贴到代码中)
2.) 值已经排序,因此线性搜索花费了太多时间,我认为这是字典解决方案的缺点。 (我想我可以通过将其拆分为几个较小的字典并使用简单的 if 条件确定要搜索哪个字典来克服这个问题)
我的第二个想法是使用 SQLite3 使其更专业,但使用 SQL 似乎并没有更快,实际上它甚至有点慢。
是否有可能利用已经排序的数据? 如果有人知道在这里做什么,我会非常高兴,因为我已经花了很长时间想出一个解决方案。
我想要的应用是访问两个计算参数,例如:
x = n(h1 = 0.6, h2 = 0.7, q = 45)
y = p(h1 = 1.2, h2 = 0.9, q = 37)
数据(以字典的形式)会是这样的:
dic = {0.6: {0.6: {25: [0.721015194906449, 38.5765797217578], 30: [0.894997480537817, 41.4758084379593], 35: [1.09507774740190, 44.4203224961566], 40: [1.32615185231568, 47.4085304722462], 45: [1.59288184615660, 50.4387051155152]}, 0.8: {25: [0.699928591599505, 38.1952586298542], 30: [0.870503808316267, 41.0984549056602], 35: [1.06723254390729, 44.0475150243940], 40: [1.29499245972316, 47.0407802928774], 45: [1.55841136584623, 50.0764537801238]}, 1.0: {25: [0.678904933323108, 37.8080339255472], 30: [0.846078073485272, 40.7153829050255], 35: [1.03946048887268, 43.6691963099343], 40: [1.26390856173115, 46.6677433191870], 45: [1.52401375488507, 49.7091525400001]}}, 0.8: {0.6: {25: [0.699928591599505, 38.1952586298542], 30: [0.870503808316267, 41.0984549056602], 35: [1.06723254390729, 44.0475150243940], 40: [1.29499245972316, 47.0407802928774], 45: [1.55841136584623, 50.0764537801238]}, 0.8: {25: [0.678904933323108, 37.8080339255472], 30: [0.846078073485272, 40.7153829050255], 35: [1.03946048887268, 43.6691963099343], 40: [1.26390856173115, 46.6677433191870], 45: [1.52401375488507, 49.7091525400001]}, 1.0: {25: [0.657945584308118, 37.4146226119758], 30: [0.821721975385228, 40.3263243022160], 35: [1.01176326951241, 43.2851144574096], 40: [1.23290137939785, 46.2891847659982], 45: [1.48968930734260, 49.3365841236722]}}, 1.0: {0.6: {25: [0.678904933323108, 37.8080339255472], 30: [0.846078073485272, 40.7153829050255], 35: [1.03946048887268, 43.6691963099343], 40: [1.26390856173115, 46.6677433191870], 45: [1.52401375488507, 49.7091525400001]}, 0.8: {25: [0.657945584308118, 37.4146226119758], 30: [0.821721975385228, 40.3263243022160], 35: [1.01176326951241, 43.2851144574096], 40: [1.23290137939785, 46.2891847659982], 45: [1.48968930734260, 49.3365841236722]}, 1.0: {25: [0.637052017659749, 37.0147183330305], 30: [0.797437318766716, 39.9309893301663], 35: [0.984142627694414, 42.8949977775162], 40: [1.20197209243436, 45.9048519379388], 45: [1.45543814550046, 48.9585152177077]}}}
字典语法为 {h1:{h2:{q:[p,n]}}}
【问题讨论】:
-
您能否详细说明您在使用字典时遇到的问题?线性搜索发生在哪里?
-
所以我的想法是在访问字典时,它不会跳转到例如h1 = 0.9 但首先要遍历所有这些,因为字典数据也可以是标称数据,例如“头发颜色:棕色”。所以我觉得字典解决方案没有利用我数据的有序性质。
-
字典对它们的键进行哈希处理,因此它们可以比线性搜索更有效地搜索键。可能值得分析性能并查看它是否适合您,因为字典搜索可能与您在其他结构中可以执行的最快搜索相当。如果您想稍微展平它,那么您可以使用 (h1, h2, q) 的元组作为键,这样您就没有嵌套字典进行多次搜索。再次,值得分析。
-
这取决于你如何生成它,但它可能值得研究一下,比如将字典作为 json 保存到文件中,然后在使用之前从文件中加载它。使用元组作为字典键时,这不会开箱即用,但它适用于嵌套字典。如果您要使用元组路由,那么您可以做一些工作,例如,将键转换为字符串并返回保存和加载。或者,您可以将扁平化的字典保存到 csv 文件中,其中键值位于第一个空闲列中,然后列表中的每个值都有一列。
-
我会写一个答案来编译其中的一些内容。
标签: python database performance search