0

以下是我的函数定义

def func_a():
    return 1

def func_b(val1):
    return val1*2

这是调用函数的一种方式:

count = 0
while count < 10000000:    
    val2 = func_b(func_a())
    count += 1

以上所用时间为:

real    0m5.003s
user    0m4.989s
sys 0m0.012s

对于具有相同函数定义的以下用法:

count = 0
while count < 10000000:    
    ret1 = func_a()
    val2 = func_b(ret1)
    count += 1

花费的时间是

real    0m5.502s
user    0m5.414s
sys 0m0.010s

我每次运行大约 10 次,两者之间的实际时间差总是 ~300-500 毫秒。

而系统时间通常只有大约 1-2 毫秒的差异。(最长约 10 毫秒)。

我使用的应用程序处理大约 60-90k 个事务,具有亚毫秒级的性能,所以这对我来说有点大。为什么这两个调用之间有这么大的区别?

编辑注意:问题修改后,下面的答案现在不太相关,请参阅原始问题的问题编辑。

4

3 回答 3

5

从可读性的角度来看(和代码维护?)我猜第一个更好?

实际上第二个更好,特别是如果您不使用function_a其他任何地方的返回值。否则,第一行将创建一个可能导致命名空间冲突的名称。考虑一下:

foo = 42

# many many lines of code later

foo = function_a()
result = function_b(foo)

print foo # oops!

从记忆的角度来看,第二个更好吗

成本是微不足道的。

两者哪一个在性能方面更好?

您无法从一种或另一种方法中获得任何性能优势,而这会在您的应用程序中产生任何实际影响。

于 2013-08-28T04:56:29.250 回答
2

没关系。由于在没有中间变量的情况下跳过了一些加载和存储,可能会有一个非常小的速度优势,并且使用该变量可能会稍微延长临时变量的生命周期,稍微影响内存使用模式,但这种差异甚至不值得考虑. 在不同的情况下,一种可能比另一种更具可读性。尽量避免超长的行,如果您要从表达式中提取片段以提高可读性,请尝试选择有意义的片段。

于 2013-08-28T04:50:00.657 回答
-1

前一种方法的缺点是您生成的中间变量永远不应再次使用,并且您或其他人可能会不小心编写其中一个(即,稍后使用“val1”而不是“val2”)。中间值不是一个严重的问题,但它们偶尔会导致编程错误。

后一种方法可能不太可读。在面向对象的上下文中看起来好多了:

val2 = function_a().function_b()
于 2013-08-28T04:53:12.927 回答