如何使我的代码更高效,使其运行时少于1秒

2024-07-05 15:20:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近有一次考试(现在已经结束了),我有一个问题: question

我可以回答这个问题。然而,最后有一个测试用例说,如果该用例的运行时间为<;1s。然而,我的问题是,我无法使运行时低于1秒。下面是我的代码和测试用例。我还要补充一点,我们不允许导入任何软件包

测试用例:

longList = [i for i in range(100000)]
print(calculateAreas(longList,longList[::-1]))

我的代码:

def calculateAreas(w_list,h_list):
    width_length = len(w_list)
    height_length = len(h_list)
    list_of_areas = []
    red_area = 0
    white_area = 0
    yellow_area = 0
    for i in range(width_length):
        for n in range(height_length):
            if (i+n-2) % 3 == 0:
                red_area += (w_list[i] * h_list[n])
            if (i+n-2) % 3 == 1:
                white_area += (w_list[i] * h_list[n])
            if (i+n-2) % 3 == 2:
                yellow_area += (w_list[i] * h_list[n])
    list_of_areas.insert(0, white_area)
    list_of_areas.insert(1, yellow_area)
    list_of_areas.insert(2, red_area)
    tuple_area = tuple(list_of_areas)
    return tuple_area

Tags: ofinforif测试用例rangeareared
2条回答

通过使用lru_缓存,可以使函数在需要时间的python代码中变得高效,它存储缓存并减少运行时间

语法-

# importing module
from functools import lru_cache

# we use lru_cache as a decorator , it takes maxsize argument
@lru_cache(maxsize=10)
def exampleFunction(str):
    time.sleep(2s)
    print(str)
# exampleFunction will take 2 seconds here to run -
exampleFunction ("when function called first time i took 2 seconds to run")

# now exampleFunction will not take a second to run as it is stored in cache
exampleFunction("exampleFunction didn't take a single second now to run")

我想说的是,加速的方法是使用列表理解,并尝试只进行必要的操作。在白色的两个轴上都有一个图案->;黄色->;红色->;白色…,我们可以使用列表理解来分离这些颜色,然后找到每种颜色的总面积。 要在轴中分离颜色,我们可以使用:

list[::3]

假设我们把w_列表[0]上的所有白色值加起来,乘以h_列表[0]上所有白色值的总和,我们将得到大约1/3的白色值。所以我们可以用h_list[1]对w_list[1]重复,用h_list[2]对w_list[2]重复。简言之,我要做的是用3个像这样的网格将白色分开

W W W-
+ + +-
+ + +-
W W W-
+ + +-

一个与另一个稍微错位,并使用列表理解来隔离和获取区域,而无需嵌套for循环:

def calculateAreas(w_list, h_list):
    white = 0
    yellow = 0
    red = 0
    for i, j in zip([0,1,2], [0,2,1]):
        white += sum(w_list[i::3]) * sum(h_list[j::3])
        yellow += sum(w_list[i::3]) * sum(h_list[(j+1)%3::3])
        red += sum(w_list[i::3]) * sum(h_list[(j+2)%3::3])
    return (white, yellow, red)

这样我们只通过了3次for循环,在一个包含100000个元素的列表中,我的慢速笔记本电脑上的计时为0.0904秒。如果我能给你一些关于代码的提示:1-尝试直接在列表元素上交互(使用枚举)2-使用'elif'和'else'语句(如果颜色选择'white',你不需要检查它是否为红色)。一般来说,如果您需要加快代码的速度,请尝试避免嵌套循环,想象一下将一个列表中的每个元素与另一个列表中的每个其他元素交互:这就是len(list)**2

相关问题 更多 >