python笔记-python编程优化:常用原则和技术介绍

本人翻译自《Exper Python Programming》

‘Premature optimization is the root of all evil in programming‘ -Donald Knuth

   优化的三原则     

  • 让它跑起来先

  一个非常常见的错误就是在编写代码之初我们就开始对代码进行优化。让人伤心的是这通常做的都是无用功,很多软件只有你跑起来了才会发现它真正的瓶颈在哪里。

  • 站在用户的视角看问题

  曾经有一个团队为了自己的项目跑起来更快加班加点最终达到了自己满意的效果,最终交付到客户那里,结果发现客户并不觉得跑得快对他有什么好处。。。

  • 始终保持代码可读(可维护)

  如果当你已经完成了90%的优化任务,而剩下10%的优化任务可能会使你的代码完全的不可读,那这个时候你最好可以停止你的优化工作了。

   优化的策略      

  • 去找别人的问题

  通常情况下我们的软件测试不可能做到100%的模拟真实环境。当客户向我们抱怨软件运行速度不如从前时,我们不妨找找是不是因为在和别的应用进行交互时候,其他应用造成的速度问题。

  • 刷硬件

  这个大家都好懂,跑的慢?先看看是不是你配置不够啊,不够就买买买!

  • 编写一个速度测试文档

  当我们开始优化工作的时候,我们不妨在我们的目标函数下面写一条注释“该函数运行时间不能超过1秒”

   寻找瓶颈        

  • 查看CPU使用率

  从CPU的角度来看呢,又分为宏观查找和微观查找。这里最常用的是cProfile,它是一个c语言的库,提供对程序资源使用的监控还有时间的记录。具体的使用方法可以点这里

  • 查看内存使用率

  既然说的是python,我们也就不得不提到python的内存分配机制,不像c语言那样,我们可以使用一个函数就知道当前变量的内存分配情况,而在python中我们是绝不会知道某个变量当前分配了多少内存空间的。。通常情况下,消耗内存空间的原因有:1.某个变量不受控制的增长;2.在全局有太多的实例,而且没有监控他们对内存的使用;3.没有正确关闭的线程;4.有__del__属性的对象在一个循环体内

  具体的内存检测工具有:Guppy、Heapy

  • 查看网络使用率

  这一部分的话我们使用通用的网络监测工具就好了。

   降低代码复杂度   

  两个维度:

  • 测量分支复杂度:程序中ifelse语句的分支有多少
  • 测量时间空间复杂度

最后两个大主题是:多线程和缓存。这两个方法也是非常重要的优化程序的方法,先写到这里,看完继续更。

时间: 2024-08-11 01:24:24

python笔记-python编程优化:常用原则和技术介绍的相关文章

Python笔记001-----简介及常用的库

1.Python是一种解释性语言,大部分代码要比编译型语言(如C++,java等)运行要慢点多. 2.对于高并发,多线程的应用程序而言,Python并不是理想语言,python有全局解释器锁(Global Interpreter Lock, GIL),放置解释器同时执行多条Python字节码指令的机制.并不是说Python不能执行真正的多线程并行代码,只不过这些代码不能在单个Python进程中执行而已.比如说,Cython项目可以集成OpenMP(一个用于并行计算的C框架)以实现并行处理循环进而

[Python笔记]Python学习笔记四

模块 在Python中,一个.py文件就是一个模块(Module) 使用模块的好处就是大大提高代码的可维护性,并且可以被其他地方引用. 同时可以避免函数名和变量名的冲突. Package(包) 每个包目录下面必须有一个 __init__.py文件 这个文件可以是空的,这个文件对应模块名就是当前目录名即包名 模块的使用 Python内置了很多模块 #!/usr/bin/env python # -*- coding:utf-8 -*- # 编写一个属于自己的模块 # 文件的第一个字符串被视为模块的

[Python笔记]Python学习笔记三

Python高阶函数 filter() 用于过滤序列 第一个参数接收一个函数,根据返回值来决定是否保留, True则留下,False则丢弃 def is_odd(n): return n%2 == 1 filter( is_odd, range(1,16) ) def not_empty(s): return s and s.strip() filter( not_empty, [ 'A', ' ', 'B ', None, ' ' ]) 内置sorted()函数用于列表排序 返回函数 将函数作

python笔记——python数据类型

一.数据类型 1.核心数据类型: 数字:int, long(python3.5已经没有), float, complex, bool 字符:str, unicode 列表:list 字典:dict 元组:tuple 集合:set(可变集合),frozenset(不可变集合) 文件:file 二.数字类型 python的数字字面量:整数,布尔型,浮点数,复数,所有数字类型均为不可变 数字操作:+ , -, *, /, //, **, %, -x, +x 三.列表 列表是一系列按照特定顺序排列的元素

python笔记 PyQt4初学随笔[1、基础类的介绍]

查看/python2.7/dist-packages/PyQt4/__init__.py发现内部未添加任何索引,难以通过help以及dir查看基本信息,所以先简单介绍一下一些常用类的功能: 1.QtCore模块 用于核心的非 GUI 功能函数,用于以下方面:日期.文件和目录.数据结构.数据流.URL.MIME.线程和进程. 2.QtGui模块 用于绘图组件以及与绘图相关的类,比如按钮.窗口.状态栏.工具栏.滑块.位图.颜色.字体等. 3.QtNetWork 模块 用于网络编程的类,用户可以用这些

Python编程中常用的12种基础知识总结

原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进制转换,Python调用系统命令或者脚本,Python 读写文件. 1.正则表达式替换目标: 将字符串line中的 overview.gif 替换成其他字符串 1 2 3 4 5 6 7 8 9 10 11 >>> lin

Python 编程中常用的 12 种基础知识总结

Python 编程中常用的 12 种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进制转换,Python调用系统命令或者脚本,Python 读写文件. 1.正则表达式替换 目标:将字符串line中的 overview.gif 替换成其他字符串 >>> line = '<IMG ALIGN="middle" SRC=\'#\'" /s

python笔记 - day7-1 之面向对象编程

python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: sele是什么? self是一个python自动会给传值得参数: 哪个对象执行方法,self就是哪个对象: 构造方法: 类中有一个特殊的方法,__init__,类()自动执行: 面向对象,三大特性: 封装,继承,多态:  

Python:笔记(3)——面向对象编程

Python:笔记(3)--面向对象编程 类型与对象 术语 程序中存储的所有数据都是对象.每个对象都有一个身份.一个类别和一个值. 如:a=42,就是用值42创建了一个整数对象. 大多数对象都拥有大量特点的属性和方法. 属性就是与对象相关的值. 方法就是被调用时将在对象上执行某些操作的函数. 使用 . 运算符可以访问属性和方法. Python中对象的一些说明 检查对象类型最佳的方式是利用内置函数 isinstance(object,type) 所有对象都有引用计数,当一个对象的引用计数归零时,他