【发布时间】:2015-05-16 16:27:12
【问题描述】:
我正在尝试优化嵌套的 for 循环,该循环将数组中的元素与数组中的其余元素进行比较。
有两部分,第一部分例如,一个Array有3个元素,每个元素是一个字典:
[{"someKey_1":"a"}, {"someKey_1":"b"}, {"somekey_1":"a"}]
第一次迭代(第一个元素与第二个元素比较):
两个元素的 "someKey" 的测试键,因为 a != b,那么我们什么也不做
第二次迭代(第一个元素与第三个元素比较):
两个元素的“someKey”的测试键,因为a == a,我们做一些逻辑
代码:
for idx, val in enumerate(set_of_pk_values):
for idx_2, val_2 in enumerate(set_of_pk_values):
if (val['someKey'] == val_2['someKey'] and idx != idx_2):
#Some Logic
第二部分与前面的例子非常相似(列表中的 3 项),在同一个字典中,我们有一个与键关联的数组(现在有一个字典,数组的每个元素中都有两个键) ,比方说:
[{"someKey_1":[b,f]}{"someKey_2":a},
{"someKey_1":[e,f]}{"someKey_2":b},
{"somekey_1":[h,k]}{"someKey_2":c}]
第一次迭代(第一个元素与第二个元素比较):
使用键循环遍历数组:someKey_1
b==b(第二个元素的 someKey_2),然后做一些逻辑
f!=b(第二个元素的 someKey_2),没有做任何逻辑
第二次迭代(第一个元素与第三个元素比较):
使用键循环遍历数组:someKey_1
b==c(第三个元素的 someKey_2),然后做一些逻辑
f!=c(第三个元素的 someKey_2),没有做任何逻辑
代码:
for idx, val in enumerate(set_of_pk_values):
for idx_2, val_2 in enumerate(set_of_pk_values):
for pred in val['someKey_1']:
if(val_2['someKey_2'] == pred):
#Some Logic
目前第一个嵌套循环的运行时间:21 秒,第二个嵌套循环约为 19 秒。与其他进程相比,1-2 秒不等,这部分显然是一个瓶颈。
谁能指出我如何优化这段简单但极其耗时的代码的正确方向?
【问题讨论】:
-
如果你在比较 1 和 2,你真的需要比较 2 和 1 吗?
-
第一个嵌套循环没有,但第二个嵌套循环需要。我在想有什么办法可以使这个 O(n)
-
你能合并嵌套循环吗?除了包含一个跳过列表然后重复解析之外,您难道不能简单地使用 if 语句跳过一个循环中的项目,并可能继续吗?
-
字典没有索引 (0..n) (你不能可靠地使用 enumerate 因为顺序可能不同)。你能告诉我们你想用代码实现什么吗?
-
Set_of_pk_values 是一个包含字典的数组。字典中有我要比较其内容的键。