如何优化这个python函数?

时间:2018-02-27 13:53:59

标签: python python-3.x function optimization

我是python编程的新手。如何优化此代码?它还给出了一个错误UnboundLocalError:在赋值之前引用的局部变量'list1'。但是如果我在循环外定义list1则需要花费太多时间来执行大型列表。

def sum_pairs(ints, s):
    list2 = []
    for i in range(len(ints)):
        if i == len(ints) - 1:
            break
        for j in range(i + 1, len(ints)):
            if i != j and (ints[i] + ints[j] == s):
                list1 = []
                if list2 == []:
                    list1[0:2] = ints[i], ints[j]
                    list2[0:2] = i, j
                elif list2[-1] > j:
                    list1[0:2] = ints[i], ints[j]
                    list2[0:2] = i, j

                break
     if list1 == []:
        return None
    return list1
print(sum_pairs([10, 5, 2, 3, 7, 5], 10))

我正在编写一个函数,它返回前两个值(请从左边解析)按照外观的顺序加起来形成总和。例如:

  **sum_pairs([10, 5, 2, 3, 7, 5], 10)
 #                 ^-----------^   5 + 5 = 10, indices: 1, 5
 #                       ^--^      3 + 7 = 10, indices: 3, 4 *
 #  * entire pair is earlier, and therefore is the correct answer
 == [3, 7]**

1 个答案:

答案 0 :(得分:3)

首先,如果未定义list1,则无法在list1上使用切片,因此您应该编写list1[0:2] = ints[i], ints[j]而不是写list1 = [ints[i], ints[j]]。 其次,算法本身效率不高。而不是循环所有值,并且对于每个值再次执行循环,其具有O(n²)复杂度,使用集合并执行单个循环具有O(n log n)复杂度。

看一下效率更高的以下代码:

def sum_pairs(ints, s):
    encountered = set()
    for i in range(len(ints)):
        if s-ints[i] in encountered:
            return [s-ints[i], ints[i]]
        encountered.add(ints[i])

print(sum_pairs([10, 5, 2, 3, 7, 5], 10))

这给出:[3, 7]