【问题标题】:Does creating separate functions instead of one big one slow processing time?创建单独的函数而不是一个大的一个会减慢处理时间吗?
【发布时间】:2009-07-04 22:41:12
【问题描述】:

我在 Google App Engine 环境中工作并使用 Python 进行编程。我正在创建一个函数,它本质上生成一个随机数/字母字符串,然后存储到内存缓存中。

def generate_random_string():
# return a random 6-digit long string

def check_and_store_to_memcache():
    randomstring = generate_random_string()
    #check against memcache
    #if ok, then store key value with another value
    #if not ok, run generate_random_string() again and check again.

创建两个函数而不是一个大函数会影响性能吗?我更喜欢两个,因为它更符合我的想法,但如果这是“最佳实践”,请不要介意将它们结合起来。

【问题讨论】:

  • 您可以缩进4个空格以使代码正确显示。

标签: python google-app-engine function performance


【解决方案1】:

专注于能够阅读并轻松理解您的代码。

完成此操作后,如果您遇到性能问题,请查看可能是什么原因造成的。

大多数语言(包括 python)在进行方法调用时往往具有相当低的开销。将此代码放入单个函数不会(显着)改变性能指标 - 我猜您的随机数生成可能是大部分时间,没有 2 个函数。

话虽如此,拆分函数确实对性能有(非常非常小的)影响。然而,我会这样想——它可能会让你从高速公路上的 80 英里/小时提高到 79.99 英里/小时(你永远不会真正注意到)。需要注意的重要事项是避免红绿灯和交通拥堵,因为它们会让你不得不完全停下来......

【讨论】:

  • 你没有提到过早的优化带来的问题多于解决的问题。
  • 我不同意您的说法,即大多数语言(包括 python)在进行方法调用时往往具有相当低的开销。 wiki.python.org/moin/PythonSpeed/…
  • @Swiss:这个例子非常做作。它在一个紧密的循环中做的工作很少,这是最坏的情况。在这种情况下,与计算随机数的成本和存储在 memcache 中的成本相比,函数开销的成本可能是微不足道的。话虽如此 - python 中函数调用的开销仍然很小,只是高于其他一些语言 - 总体而言,它对整体性能的影响仍然很小,除非你的函数做的工作量很小。跨度>
【解决方案2】:

几乎在所有情况下,提高速度的“内联”功能就像理发减肥一样。

【讨论】:

    【解决方案3】:

    里德是对的。对于您正在考虑的更改,函数调用的成本是少数周期,并且您必须每秒执行 10^8 次左右才能注意到。

    但是,我要提醒的是,人们经常会走向另一个极端,然后好像函数调用代价高昂。我在过度设计的系统中看到了这一点,其中有许多抽象层。

    发生的情况是,有一些人类心理学认为,如果某件事很容易调用,那么它就很快。这会导致编写比严格必要的函数调用更多的函数调用,当这种情况发生在多个抽象层上时,浪费可能是指数级的。

    按照 Reed 的驱动示例,函数调用可以像绕道一样,如果绕道包含绕道,并且如果这些绕道中也包含绕道,那么很快就会浪费大量时间,没有显而易见的原因,因为每个函数调用看起来都是无辜的。

    【讨论】:

      【解决方案4】:

      就像其他人所说的那样,在这种特殊情况下我不会担心它。与每个函数内部所做的相比,函数调用所涉及的非常小的开销将相形见绌。并且只要这些函数不被快速连续调用,它可能无论如何都没有多大关系。

      不过,这是一个很好的问题。在某些情况下,最好不要将代码分解为多个函数。例如,在使用嵌套循环处理数学密集型任务时,最好在内循环中进行尽可能少的函数调用。这是因为简单的数学运算本身非常便宜,而且函数调用开销会导致明显的性能损失。

      几年前,我发现我在 VC++ 应用程序中使用的数学库中的 hypot(hypotenuse)函数非常慢。这对我来说似乎很荒谬,因为它是一组如此简单的功能—— return sqrt(a * a + b * b)——这有多难?所以我编写了自己的代码并设法将性能提高了 16 倍以上。然后我在函数中添加了“inline”关键字,使它比那个快了 3 倍(此时大约快了 50 倍)。然后我将代码从函数中取出并放入我的循环中,并看到另一个小的性能提升。所以...是的,这些是您可以看到差异的场景类型。

      【讨论】:

      • 不会是 sqrt(aa+bb) 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多