为了账号安全,请及时绑定邮箱和手机立即绑定

传递变量与为多次调用的函数重新定义变量的效率

传递变量与为多次调用的函数重新定义变量的效率

至尊宝的传说 2023-09-05 20:28:46
我有一个关于效率的问题,我对处理速度和内存效率都很感兴趣。我正在编写多次调用函数的代码。在其参数中,有些参数需要保留变量,因为每次调用这些参数时都会使用不同的值来调用该函数。然而,其他的则是不变的,不仅每次调用函数时都是相同的,而且每次运行代码时都不会改变,甚至在运行之间也不会改变。但是,我仍然想将它们写为变量而不是对它们进行硬编码,以便我可以通过描述性名称来引用它们。在下面的示例中,我期望前两个效率相同,而最后一个效率不高。但是,我不清楚为什么。有人能帮忙解释一下吗?编辑:在下面的示例中,我仅使用 100 次迭代。实际上,我希望以这种方式调用函数数千或数百万次。编辑2:对于那些只是告诉我对其进行概要分析的人。请注意,我问的是为什么,而不仅仅是是否某些方法比其他方法更有效。分析会回答是否,但不会回答为什么。import numpy as npdef myfunc(a):    (a**4) + np.sqrt(3)*a - a/3for a in arange(100):    y[a] = myfunc(a)相对import numpy as npmyb = 3def myfunc(a):    (a**4) + np.sqrt(myb)*a - a/mybfor a in arange(100):    y[a] = myfunc(a)相对import numpy as npmyb = 3def myfunc(a, b):    (a**4) + np.sqrt(b)*a - a/bfor a in arange(100):    y[a] = myfunc(a, myb)
查看完整描述

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() 的原因。


内存是一个不同的问题,但通常这是由问题本身决定的,而不是由你如何做决定的。当然,在某些情况下,内存会成为一个特殊的问题,您需要变得聪明(批量处理、使用流处理等)。内存问题是,如果能够知道我们正在讨论的数字类型以及数据的总体情况会是什么样子,那就太好了。


查看完整回答
反对 回复 2023-09-05
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信