【发布时间】:2019-09-24 21:29:16
【问题描述】:
我在 python3 中完成了我的算法,以解决 codewars.com 上的“codekata”。(https://www.codewars.com/kata/odder-than-the-rest-1/train/python) 我的代码正确并以足够的速度解决了初始测试用例。但是,在提交最终测试时,代码会因为解决给定任务的时间过长而超时。
最初,我将 for 循环的内容实现为一个名为“calculate_oddness_level”的分离函数。我发现这可能比在 for 循环中执行要慢一些,所以我就这样做了。
我知道在 for 循环中执行 while 循环并不是最佳性能。我多次思考如何避免这种情况。但是,我需要确定列表中每个奇数的“奇数”级别。为了确定“级别”,需要一个循环,并且似乎比递归更快。因此,除了在 for 循环中运行 while 循环之外,似乎别无选择。但是,我立即将所有偶数分配为“奇数级”0,从而消除了所有偶数的运行循环。
因此,我不知道如何才能在性能上取得任何显着提升。
def oddest(a):
if len(a) == 0: return None
list_of_oddness_levels = []
for n in a:
if n % 2 == 0:
list_of_oddness_levels.append(0)
else :
level = 1
while True:
n = (n-1)/2
if n % 2 == 0 or n % 1 != 0:
break
else:
level += 1
list_of_oddness_levels.append(level)
print("adding Level!")
maximum = max(list_of_oddness_levels)
index_of_maximum = list_of_oddness_levels.index(maximum)
if list_of_oddness_levels.count(maximum) > 1:
return None
else:
return a[index_of_maximum]
根据最初的测试用例,我的代码应该能正确解决任务。然而,它似乎运行得很慢,因为它在最终提交期间遇到了超时错误。
我知道,可能有一些简单的数学解决方案或一些 5 行高级代码利用一些我不知道的 python3 库或特殊函数。然而,一个详细的、一步一步的、尽可能具有描述性的“干净代码”解决方案将是首选。
【问题讨论】:
-
在您的代码上使用line_profiler 可能会有所帮助。