返回介绍

建议84:掌握循环优化的基本技巧

发布于 2024-01-30 22:19:09 字数 1332 浏览 0 评论 0 收藏 0

循环的优化应遵循的原则是尽量减少循环过程中的计算量,多重循环的情形下尽量将内层的计算提到上一层。

1)减少循环内部的计算。下面两个示例实现的是同一功能,但提倡使用第二种循环实现,因为第一种循环中d=math.sqrt(y)位于循环内部,每次循环过程中都会重新计算一遍,无形中增加了系统开销。测试结果表明,第二种运算的计算速率比第一种运算的速率快40%~60%。

示例一:

for i in range(iter):
  d=math.sqrt(y)
  j+=i*d

示例二:

d=math.sqrt(y)
for i in range(iter):
  j+=i*d

2)将显式循环改为隐式循环。假设求等差数列1,2……,n的和,可以直接通过如下循环来计算:

sum = 0
for i in xrange(n+1):
  sum = sum+i

也可以直接写出得到计算结果的值:n*(n+1)/2。显然直接计算表达式的值效率更高,程序中如果有类似的情形,可以将显式循环改为隐式。当然这可能会带来另一个负面影响:牺牲了代码的可读性。因此这种情况下清晰、恰当的注释是非常必要的。

3)在循环中尽量引用局部变量。在命名空间中局部变量优先搜索,因此局部变量的查询会比全局变量要快,当在循环中需要多次引用某一个变量的时候,尽量将其转换为局部变量。下面的例子中如果使用示例二代替示例一,性能将提高10%~15%。

示例一:

x = [10,34,56,78]
def f(x):
    for i in xrange(len(x)):
        x[i] = math.sin(x[i]) 
    return x

示例二:

def g(x):
    loc_sin = math.sin 
    for i in xrange(len(x)):
          x[i] = loc_sin(x[i]) 
    return x

4)关注内层嵌套循环。在多层嵌套循环中,重点关注内层嵌套循环,尽量将内层循环的计算往上层移。如下面的示例一中,v1[i]在第二层循环for j in range(len(v2))时针对每个i其值保持不变,因此可以在外层循环中使用临时变量替代而不是每次都重新计算,如示例二所示。

示例一:

for i in range(len(v1)):
         for j in range(len(v2)):
              x = v1[i] + v2[j]

示例二:

for i in range(len(v1)):
         v1i = v1[i]
         for j in range(len(v2)):
              x = v1i + v2[j]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文