在其他人中调用函数会导致性能问题吗?

时间:2018-05-14 14:50:51

标签: python

这个问题并不是特定于Python的,但这是我第一次遇到它。

简单地说,我有一些由我的main调用的函数,但是每次其中一个函数结束时我都需要调用main函数。这里有一些代码证明了这个问题:

def main():
    text = raw_input()
    command(text)

def command(name):
    if name == "help":
        helpcmd()
    else:
        main()

def helpCmd():
    print("This is the help command")
    main()

main()

我担心过了一段时间我的过程会是这样的:

main->command->helpCmd->main->command->main->...

这会是性能问题吗?如果是的话,有什么建议吗?

2 个答案:

答案 0 :(得分:4)

要回答您的问题,您需要了解调用堆栈。

每次调用函数时,程序都需要记住它的位置,以便 - 当被调用者返回时 - 它可以跳回调用者中的同一点。因此,它将其当前状态推送到堆栈。使用函数是最佳实践的一个重要部分(出于如此多的原因:抽象,封装,代码重用等),因此现代语言(包括Python)将框架推入堆栈是一个非常轻量级的操作。但是,它不是免费

如果你使用一个自称为循环的函数,你最终会溢出调用堆栈。如果你需要一个程序无限循环(甚至很多次),最好的办法是使用为此目的而构建的构造:循环。

注意:请参阅chepner关于尾部调用优化的评论,这是许多语言(特别是函数式语言)编译/执行过程的一部分。

答案 1 :(得分:0)

呃......这实际上根本不是问题,因为那只是我用奇怪的方式思考。

简单地说,每当我调用main函数时,应该用简单的return指令替换它,以便离开函数并返回到父函数本身。现在,如果没有在无限循环中添加对main函数的调用,那也是行不通的,例如:

while True:
    main()

现在,这将迫使进程等待每个main()周期结束以启动一个新进程,而不是每次到达结尾时都会愚蠢地调用自身。

现在,作为个人记录,请不要贬低我!我有一个糟糕的思考过程导致了一个错误,并自己纠正了它。这也是我想在这里发布我自己的“解决方案”的原因,因为这样可以保持自己的羞辱。