以下是我的功能定义
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的交易,具有亚毫秒的性能,所以这对我来说很重要。为什么两次调用之间存在这么大差异?
编辑注意:问题修改后,以下答案现在没有多大关系,请参阅原始问题的问题编辑。
答案 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()