Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使我的代码更高效,使其运行时少于1秒_Python_Loops_For Loop_Iteration_Runtime - Fatal编程技术网

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

Python 如何使我的代码更高效,使其运行时少于1秒,python,loops,for-loop,iteration,runtime,Python,Loops,For Loop,Iteration,Runtime,我最近做了一个测试,现在已经结束了,我有一个问题: 我可以回答这个问题。然而,最后有一个测试用例说,如果该用例的运行时间是的话,我们会得到额外的10分。通过使用lru_缓存,可以在需要时间的python代码中提高函数的效率,它存储缓存并减少运行时间 语法- # importing module from functools import lru_cache # we use lru_cache as a decorator , it takes maxsize argument @lru_c

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


我可以回答这个问题。然而,最后有一个测试用例说,如果该用例的运行时间是的话,我们会得到额外的10分。通过使用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-尝试直接在列表元素上进行交互使用enumerate 2-使用'elif'和'else'语句如果颜色选择了'white',你不需要检查它是否是红色。一般来说,如果您需要加快代码的速度,请尝试避免嵌套循环,想象一下一个列表中的每个元素与另一个列表中的每个其他元素交互:这就是lenlist**2

如果您希望效率高于其他所有方面,那么python是不可取的,可以尝试使用C++对代码运行探查器,这将返回最耗时的步骤。看见我建议按tottime排序运行它,因为这是您想要减少的内容。@Evorage如果您阅读了这个问题,您可以清楚地看到这是一个用python解决的任务。所以请不要盲目地评论C++更快。你可以肯定:你确信LeLangList= 100000的测试用例吗?对于低一个数量级lenlongList=10000的情况,我会有一个解决方案~0.3s,但这个测试用例目前至少在我的机器上是27秒…@venky_uuuu如果你注意到我只评论了一个建议,我没有回答这个问题,因此我的评论是有效的。如果你必须经常重新运行代码,这很好。但是,对于通常只运行一次的代码,这并不能解决问题。
W--W--W-
+--+--+-
+--+--+-
W--W--W-
+--+--+-
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)