创建单独的函数而不是一个大的缓慢处理时间?

时间:2009-07-04 22:41:12

标签: python google-app-engine function performance

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

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 个答案:

答案 0 :(得分:33)

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

完成此操作后,如果遇到性能问题,请查看可能导致此问题的原因。

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

话虽这么说,分裂功能确实会对性能产生(非常非常小的)影响。但是,我会这么想的 - 它可能会让你从高速公路上的80英里/小时到79.99英里/小时(你永远不会注意到)。值得注意的重要事项是避开红绿灯和堵车,因为它们会让你不得不完全停下来......

答案 1 :(得分:18)

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

答案 2 :(得分:4)

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

但是,我会提醒说,人们往往会走向另一个极端,然后就好像函数调用一样昂贵。我在过度设计的系统中看到过这种情况,其中存在许多抽象层。

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

按照里德的驾驶示例,函数调用可以像绕行一样,如果绕行包含弯路,如果那些也包含弯路,很快就会浪费大量时间,因为没有明显的原因,因为每个函数调用看起来都是无辜的。

答案 3 :(得分:2)

就像其他人所说的那样,在这种特殊情况下我不会担心。与每个函数内部的操作相比,函数调用中涉及的非常小的开销会很苍白。只要这些功能不能快速连续调用,无论如何都可能无关紧要。

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

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