python - 性能差异

时间:2013-08-28 04:43:46

标签: python performance

以下是我的功能定义

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毫秒。

而sys时间通常只有约1-2毫秒不同。 (最长约10毫秒)。

我使用的应用程序处理大约60-90k的交易,具有亚毫秒的性能,所以这对我来说很重要。为什么两次调用之间存在这么大差异?

编辑注意:问题修改后,以下答案现在没有多大关系,请参阅原始问题的问题编辑。

3 个答案:

答案 0 :(得分:5)

  

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

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

foo = 42

# many many lines of code later

foo = function_a()
result = function_b(foo)

print foo # oops!
  

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

成本微不足道。

  

两者中的哪一个更好   性能

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

答案 1 :(得分:2)

没关系。由于在没有中间变量的情况下跳过一些加载和存储,可能存在极小的速度优势,并且使用该变量可能会延长一点暂时的生命周期,稍微影响内存使用模式,但差异甚至不值得考虑。在不同的情况下,一个可能比另一个更可读。尽量避免使用超长线条,如果你要从表达式中删除部分以便于阅读,请尝试选择有意义的部分。

答案 2 :(得分:-1)

前一种方法的缺点是你生成了永远不会再次使用的中间变量,而你或其他人可能会意外地写出其中一个(也就是说,后来使用“val1”而不是“val2”)。中间值不是一个严重的问题,但它们偶尔会导致编程错误。

后一种方法可能性稍差。在面向对象的上下文中它看起来好多了:

val2 = function_a().function_b()