优化的longest_run功能

时间:2017-03-12 11:02:41

标签: python-3.x

人。我实现了执行以下操作的功能(我的作业):   假设L是包含至少2个元素的整数列表。     找到L中最长的数字,其中最长的数字可以     要么单调递增,要么单调递减。     如果运行时间最长,请选择最长运行     首先发生。     不修改列表。     返回最长运行的总和

def run_for_el(L, n, operand):
    entry = [L[n]]
    count = n
    while eval ("L[count]" + operand + "L[count+1]"):
        entry.append(L[count+1])
        if count < len(L)-2:
            count += 1
        else: break
    return entry

def longest_run2(L):
    if len(L) == 2:
        return sum(L)
    storage = []
    for n in range(len(L) - 2):

        if L[n] <=  L[n+1]:
            operand = "<="
            storage.append(run_for_el(L, n, operand))

        if L[n] >= L[n+1]:
            operand = ">="
            storage.append(run_for_el(L, n, operand))

    maximum = storage [0]
    for entry in storage:
        if len (entry) > len (maximum):
            maximum = entry
    return (sum (maximum))

这是一个正确的决定,并通过了所有测试用例。关键是我不确定它是最有效的方法。大师的谁可以建议一个更好的?我想优化它。谢谢!

1 个答案:

答案 0 :(得分:1)

我没有看到在性能方面重用功能的优势。我只是这样写的。

def longest_run(l):
    # increasing
    max_len_inc = cur_len = 1
    cur_sum = l[0]
    for n in range(1, len(l)):
        if l[n] >= l[n-1]:
            cur_sum += l[n]
            cur_len += 1
        else:
            if cur_len > max_len_inc:
                max_len_inc = cur_len
                max_sum_inc = cur_sum
                min_idx_inc = n
            cur_len = 1
            cur_sum = l[n]
        if cur_len > max_len_inc:
            max_len_inc = cur_len
            max_sum_inc = cur_sum
            min_idx_inc = n

    # decreasing
    max_len_dec = cur_len = 1
    cur_sum = l[0]
    for n in range(1, len(l)):
        if l[n] <= l[n-1]:
            cur_sum += l[n]
            cur_len += 1
        else:
            if cur_len > max_len_dec:
                max_len_dec = cur_len
                max_len_dec = cur_sum
                min_idx_dec = n
            cur_len = 1
            cur_sum = l[n]
    if cur_len > max_len_dec:
        max_len_dec = cur_len
        max_sum_dec = cur_sum
        min_idx_dec = n

    if max_len_inc > max_len_dec:
        return(max_sum_inc)
    elif max_len_inc < max_len_dec:
        return(max_sum_dec)
    else:
        if min_idx_inc < min_idx_dec:
            return (max_sum_inc)
        else:
            return (max_sum_dec)

正如您所看到的,只有l[n] >= l[n-1]部分不同,所以它看起来冗长冗余,我知道。但速度呢?

l = [9, 1,2,3, 1,1,2,2,3,3,4,4, 9, 8,7,6,5,4, 1,2,34,4,5,6,7,8,9,10,11,12,14,14,16,19]

import time

start_time = time.time()
for i in range(500):
    a = longest_run(l)
print(time.time() - start_time)  # 0.011501550674438477

start_time = time.time()
for i in range(500):
    a = longest_run2(l)
print(time.time() - start_time)  # 2.1403748989105225

简单的解决方案速度提高了200倍。希望这会有所帮助。