1 回答
TA贡献1872条经验 获得超3个赞
你所说的效率水平并不重要。您应该担心代码的可读性,而不是移动一些值的效率。如果代码每次通过循环将值传递给函数更具可读性,即使它们没有改变,那么也将它们传递给函数。例如,将事物放入全局变量中通常在理解代码的作用方面可读性较差。
这是我整理的一个例子:
import random
def foo(iter, a, b, c, d, e, f, g, h, i ,j):
x = a + b + c + d + e + f + g + h + i + j
if iter % 100000 == 0:
print(x)
for i in range(1000000):
foo(i, random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100)
结果:
658.9874644541911
643.4372986147371
636.6218502753122
475.3660640474451
648.4789890659888
466.2721794578193
595.3755252194462
583.45879143973
498.04278700281304
283.2047039562956
此代码执行一百万次迭代,创建 10 个随机值,将每个值乘以 100,将它们单独传递到函数中,然后在函数中对它们求和。每 100,000 次迭代,我都会打印总和值,作为健全性检查。
在我的 Macbook Pro 上运行只需 2-3 秒。如今我们的计算机真的非常非常快而且功能强大。如此之多以至于几乎不值得担心您所谈论的优化类型。
更新:为了进一步推动这一点,并且因为我很好奇,我尝试取出随机数生成,因此运行以下命令:
for i in range(1000000):
foo(i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
这基本上是瞬时运行的,眨眼间就打印了 55 十次。所以第一个例子大部分是10M随机数的生成。我将进一步指出,由于涉及这些常量,编译器和处理器可能都在优化 wazoo,因为在这种情况下没有任何变化。但这只会进一步推动这一点。没有理由担心传递常量值,部分原因是现在的编译器和处理器会为您识别并优化此类模式。避免这些优化是我在第一个示例中使用 random() 的原因。
内存是一个不同的问题,但通常这是由问题本身决定的,而不是由你如何做决定的。当然,在某些情况下,内存会成为一个特殊的问题,您需要变得聪明(批量处理、使用流处理等)。内存问题是,如果能够知道我们正在讨论的数字类型以及数据的总体情况会是什么样子,那就太好了。
添加回答
举报