如何使我的代码更高效,使其运行时间少于 1 秒
How to make my code more efficient so it has a runtime of less than 1sec
我最近考试了(现在结束了),我有这个问题:
question
而且我可以做题。然而,最后有一个测试用例说,如果该用例的运行时间小于 1 秒,我们将获得额外的 10 分。但是,我的问题是我无法让运行时间低于 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
我会说加快速度的方法是使用列表理解并尝试只进行必要的操作。白色 -> 黄色 -> 红色 -> 白色...的两个轴上都有一个图案,我们可以使用列表推导来分离这些颜色,然后求出每种颜色的总面积。
要在轴上分隔颜色,我们可以使用:
list[::3]
假设我们可以将 w_list[0] 上的所有白色值相加并乘以 h_list[0] 上所有白色值的总和,我们将得到大约 1 /3 的白人总价值。所以我们可以用 h_list[1] 和 w_list[2] 用 h_list[2] 重复 w_list[1] 和 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.0904s。如果我可以给你一些关于你的代码的提示:1- 尝试直接通过列表元素进行交互(使用枚举)2- 使用 'elif' 和 'else' 语句(如果选中颜色 'white',你不需要检查它是否是红色的)。通常,如果您需要加快代码速度,请尝试避免嵌套循环,想象一下将一个列表中的每个元素与另一个列表中的每个其他元素进行交互:这就是 len(list)**2!
我最近考试了(现在结束了),我有这个问题: question
而且我可以做题。然而,最后有一个测试用例说,如果该用例的运行时间小于 1 秒,我们将获得额外的 10 分。但是,我的问题是我无法让运行时间低于 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
我会说加快速度的方法是使用列表理解并尝试只进行必要的操作。白色 -> 黄色 -> 红色 -> 白色...的两个轴上都有一个图案,我们可以使用列表推导来分离这些颜色,然后求出每种颜色的总面积。 要在轴上分隔颜色,我们可以使用:
list[::3]
假设我们可以将 w_list[0] 上的所有白色值相加并乘以 h_list[0] 上所有白色值的总和,我们将得到大约 1 /3 的白人总价值。所以我们可以用 h_list[1] 和 w_list[2] 用 h_list[2] 重复 w_list[1] 和 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.0904s。如果我可以给你一些关于你的代码的提示:1- 尝试直接通过列表元素进行交互(使用枚举)2- 使用 'elif' 和 'else' 语句(如果选中颜色 'white',你不需要检查它是否是红色的)。通常,如果您需要加快代码速度,请尝试避免嵌套循环,想象一下将一个列表中的每个元素与另一个列表中的每个其他元素进行交互:这就是 len(list)**2!