我在Python上遇到了性能问题。下面的代码片段有4个嵌套循环遍历OrderedDict, matrix_col ,其中包含11000个项目。另一个迭代超过了一个默认指令 trans ,其中还包含约11000个项目。执行此过程需要太长时间。如果有人可以建议如何提高性能,我感激不尽。
0 Tue Oct 6 11:31:18 2015
1 Tue Oct 6 11:31:46 2015
2 Tue Oct 6 11:32:19 2015
3 Tue Oct 6 11:32:52 2015
4 Tue Oct 6 11:33:19 2015
5 Tue Oct 6 11:33:46 2015
这是它目前的表现。它基本上每分钟处理2个项目。使用此速度,形成矩阵需要5天以上, trans_mat :
var dataObject = {
'FirstName': $('#FirstName').val(),
'LastName': $('#LastName').val()
};
$.ajax({
type: 'POST',
url: '@Url.Action("Submit", "Home")',
contentType: 'application/json;',
dataType: 'json',
data: dataObject,
success: function (result) {
debugger;
alert('Success');
},
error: function (response) {
debugger;
alert('Error');
}
});
答案 0 :(得分:2)
您没有利用字典可用的快速查找功能。在字典中找到一个键是O(1)。要解决此问题,您只需更改算法,这样就不会迭代所有键来寻找您想要的那些。
from itertools import product
trans_mat = [ [trans[u1][u2]] if (u1 in trans) and (u2 in trans[u1]) else [0]
for u1 in matrix_col for u2 in matrix_col ]
答案 1 :(得分:1)
如果没有上下文,您很难理解逻辑以及您想要实现的目标,但您应该考虑更改算法以首先迭代trans
,然后检查trans_mat
。类似的东西:
for w1, t_val in trans.items():
w1_is_in_matrix_col = str(w1) in matrix_col
for w2, c in t_val.items():
if w1_is_in_matrix_col and str(w2) in matrix_col:
trans_mat.append([c])
else:
trans_mat.append([0])
从理论上讲,你可以在这里使用列表理解,这也会给你一些提升(但与当前的低效率相比较小)。