我正在使用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.
创建两个函数而不是一个大函数会影响性能吗?我更喜欢两个,因为它更符合我的想法,但如果这是“最佳实践”,请不要介意将它们结合起来。
答案 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倍)。然后我把代码从函数中取出并放入我的循环中,看到了另一个小的性能提升。所以...是的,那些是可以看到差异的场景类型。