- Preface 前言
- 第1章 引论
- 第2章 编程惯用法
- 第3章 基础语法
- 建议19:有节制地使用 from…import 语句
- 建议20:优先使用 absolute import 来导入模块
- 建议21:i+=1 不等于 ++i
- 建议22:使用 with 自动关闭资源
- 建议23:使用 else 子句简化循环(异常处理)
- 建议24:遵循异常处理的几点基本原则
- 建议25:避免 finally 中可能发生的陷阱
- 建议26:深入理解 None 正确判断对象是否为空
- 建议27:连接字符串应优先使用 join 而不是 +
- 建议28:格式化字符串时尽量使用 .format 方式而不是 %
- 建议29:区别对待可变对象和不可变对象
- 建议30:[]、() 和 {}:一致的容器初始化形式
- 建议31:记住函数传参既不是传值也不是传引用
- 建议32:警惕默认参数潜在的问题
- 建议33:慎用变长参数
- 建议34:深入理解 str() 和 repr() 的区别
- 建议35:分清 staticmethod 和 classmethod 的适用场景
- 第4章 库
- 建议36:掌握字符串的基本用法
- 建议37:按需选择 sort() 或者 sorted()
- 建议38:使用 copy 模块深拷贝对象
- 建议39:使用 Counter 进行计数统计
- 建议40:深入掌握 ConfigParser
- 建议41:使用 argparse 处理命令行参数
- 建议42:使用 pandas 处理大型 CSV 文件
- 建议43:一般情况使用 ElementTree 解析 XML
- 建议44:理解模块 pickle 优劣
- 建议45:序列化的另一个不错的选择 JSON
- 建议46:使用 traceback 获取栈信息
- 建议47:使用 logging 记录日志信息
- 建议48:使用 threading 模块编写多线程程序
- 建议49:使用 Queue 使多线程编程更安全
- 第5章 设计模式
- 第6章 内部机制
- 建议54:理解 built-in objects
- 建议55:init() 不是构造方法
- 建议56:理解名字查找机制
- 建议57:为什么需要 self 参数
- 建议58:理解 MRO 与多继承
- 建议59:理解描述符机制
- 建议60:区别 getattr() 和 getattribute() 方法
- 建议61:使用更为安全的 property
- 建议62:掌握 metaclass
- 建议63:熟悉 Python 对象协议
- 建议64:利用操作符重载实现中缀语法
- 建议65:熟悉 Python 的迭代器协议
- 建议66:熟悉 Python 的生成器
- 建议67:基于生成器的协程及 greenlet
- 建议68:理解 GIL 的局限性
- 建议69:对象的管理与垃圾回收
- 第7章 使用工具辅助项目开发
- 第8章 性能剖析与优化
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
建议84:掌握循环优化的基本技巧
循环的优化应遵循的原则是尽量减少循环过程中的计算量,多重循环的情形下尽量将内层的计算提到上一层。
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论