【问题标题】:How to make my code more efficient so it has a runtime of less than 1sec如何使我的代码更高效,使其运行时间小于 1 秒
【发布时间】:2020-09-19 09:17:48
【问题描述】:

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

我可以做这个问题。然而,最后有一个测试用例说,如果该用例的运行时间

测试用例:

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

【问题讨论】:

  • 如果您希望效率高于一切,python 不是最好的选择,请尝试使用 C++
  • 您可以在您的代码上运行分析器,这应该会为您返回最耗时的步骤。见here。我建议按tottime 排序运行它,因为这是你想要减少的。
  • @Evorage 如果您阅读了这个问题,您可以清楚地看到这是一个打算在 python 中解决的作业。所以请不要只是盲目地评论“C++ fAsTEr”。
  • 只是为了确定:您确定len(longList) = 100000 的测试用例吗?对于低一个数量级(len(longList) = 10000)的情况,我会有一个解决方案(~0.3s),但这个测试用例目前是 27s(至少在我的机器上......)。
  • @venky__ 如果你注意到我只评论了一个我没有回答问题的建议,因此我的评论是有效的

标签: python loops for-loop iteration runtime


【解决方案1】:

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

list[::3]

假设我们可以将 w_list[0] 上的所有白色值相加并乘以 h_list[0] 上所有白色值的总和,我们将得到大约 1/3 的白色总值。所以我们可以对 w_list[1] 和 h_list[1] 和 w_list[2] 和 h_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”语句(如果颜色选中“白色”,你不需要检查它是否是红色的)。通常,如果您需要加快代码速度,请尝试避免嵌套循环,想象一个列表中的每个元素与另一个列表中的每个其他元素进行交互:那就是 len(list)**2!

【讨论】:

    猜你喜欢
    • 2014-07-17
    • 2017-10-18
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多