【问题标题】:Using a variable to store a function call?使用变量来存储函数调用?
【发布时间】:2013-08-23 18:11:00
【问题描述】:

假设我有一个函数,它需要相当长的时间来运行。 主要是我想用 same 参数多次调用这个函数。

我的最终问题是,我应该将返回值存储在一个变量中并使用它还是只是多次调用该函数?哪种方式需要更少的计算?

现代语言的编译器(如果有的话)是否能够判断一个函数是否是纯函数?如果是,编译器是否能够优化同一块中的多个调用?如果是,那么我只调用这些函数比使用占位符变量更有意义(因为我将浪费计算来执行赋值/绑定名称)?

编辑:这是一个例子

if myPureFunction(a,b) == 1:
    print(1)
elif myPureFunction(a,b) == 2:
    print(2)
elif myPureFunction(a,b) == 3:
    print(3)
else:
    print(4)

对比

var = myPureFunction(a,b) 
if var == 1:
    print(1)
elif var == 2:
    print(2)
elif var == 3:
    print(3)
else:
    print(4)

提前致谢。

【问题讨论】:

  • 这是纯函数吗?
  • 不失礼数,如果你不知道这些问题的答案,那么你担心的一个循环在这里和那里可能会放错地方(不是不能优化,只是您可能会错过更重要的事情)。
  • Memoization(特别是自动记忆)
  • @Joowani 请记住,通常不会发生自动记忆。计算输出一次,存储它然后使用该存储值的习惯用法非常普遍,几乎不值得一提。存储和使用变量,不用担心开销;您的编译器将更轻松地优化 那个
  • 我相信这种优化是特定于语言或使用的编译器的——这个问题的答案不太可能与语言无关。

标签: compiler-construction language-agnostic compiler-optimization


【解决方案1】:

您的答案取决于您的编译器的优化。 如果函数“myPureFunction()”的主体在同一个翻译单元(您的 C 文件)中,那么一些编译器可以对第一个示例执行优化并将 3x 函数调用替换为仅一个。 但并非所有编译器都可以进行这种优化,第二个变体会更好。 我这么说是因为我们的编译器(我在工作中实现的)做不到 =)

【讨论】:

    【解决方案2】:

    我认为您可能正在寻找的答案是递归。这意味着多次调用同一个函数,但是每次调用都会分解问题。(但老实说,我并不完全理解你的实际问题是什么)

    这里有一个来自 TheNewBoston 的简单递归示例,可能会对您有所帮助。

    https://www.youtube.com/watch?v=fpuWkZs51aM

    【讨论】:

    • 你可能想再看看这个问题......我认为你的答案与它没有任何关系。
    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 2011-04-22
    • 2019-02-19
    • 2011-04-27
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多