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语句的分支有多少
- 测量时间空间复杂度
最后两个大主题是:多线程和缓存。这两个方法也是非常重要的优化程序的方法,先写到这里,看完继续更。
python笔记-python编程优化:常用原则和技术介绍的更多相关文章
- python笔记之编程风格大比拼
python笔记之编程风格大比拼 虽然我的python age并不高,但我仍然愿意将我遇到的或者我写的有趣的python程序和大家一块分享,下面是我找到的一篇关于各类python程序员的编程风格的比较 ...
- python笔记32-ddt框架优化(生成html报告注释内容传变量)
前言 至于什么是ddt这个可以参考我之前写的博客内容,使用ddt框架的时候,有个问题困扰我很久了,一直没得到解决(也有很大小伙伴问过我,没解决抱歉了!) 这个问题就是:如何使用ddt框架时,生成的ht ...
- Python笔记001-----简介及常用的库
1.Python是一种解释性语言,大部分代码要比编译型语言(如C++,java等)运行要慢点多.2.对于高并发,多线程的应用程序而言,Python并不是理想语言,python有全局解释器锁(Globa ...
- python笔记 面向对象编程从入门到高级
目录: 一.概念 二.方法 2.1组合 2.2继承 2.3多态 2.4封装 2.5归一化设计 三.面向对象高级 3.1 反射(自省) 3.2 内置方法__getatter__, __ ...
- Python笔记002-Python编程基础概念
第二章(1):Python编程基础概念 1. Python 程序的构成 Python 程序有模块组成.一个模块对应 Python 源文件,一般后缀名是:.py. 模块有语句组成.运行 Python程序 ...
- python 笔记4-- 函数式编程
高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式. 在python中 函数也是一种变量 def add(x, y, f): return f(x) + f( ...
- Python笔记-IO编程
IO在计算机中是指input和output(数据输入与输出),涉及到数据交换(磁盘.网络)的地方就需要IO接口. 输入流input stream是指数据从外面(磁盘.网络服务器)流入内存:输出流out ...
- Python笔记-面向对象编程
1.类和实例 面向-对象的三大特点:数据封装.继承和多态 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象.自定义的对象数据类型就是面向对象中的类(Class)的概念. 假设我们要处 ...
- python笔记--socket编程
socket编程 osi七层模型 socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族 ...
随机推荐
- 【CSS3】CSS3:border-image的详解和实例
border-image简介 border-image是CSS3中的新特性.目前几乎所有的主流浏览器都已经支持该特性,详情请移步border-image的兼容性. border-image属性及使用说 ...
- 【追寻javascript高手之路04】理解prototype
前言 中午时候我去药店称了下体重,好家伙!我减肥成功了,足足比上个月瘦了10斤!于是想减肥就去郑州吧... 然后回来迷迷糊糊睡了一会,居然想起了周三的面试,有点小遗憾有点小触动. 这次回成都后,还没有 ...
- 【追寻javascript高手之路02】变量、作用域知多少?
前言 本来想把这个与上篇博客写到一起的,但是考虑到是两个知识点还是分开算了,于是我们继续今天的学习吧. 基本类型与引用类型 ECMAScript的的变量有两种类型: 基本类型(值类型):简单数据段 引 ...
- Maven发布工程到公共库
1.发布工程 新建一个 Maven build 选择要发布的工程
- 学习zepto.js(对象方法)[1]
zepto也是使用的链式操作,链式操作:函数返回调用函数的对象. 但并不是所有的对象方法都可以进行链式操作,举几个例子:.size(),.html()|.text()//不传参数的情况下; 若非特殊说 ...
- linux系统免密码登陆
有两台机器,系统都是CentOS6.5,IP分别为192.168.2.150,192.168.2.151.现在150需要SSH免密码登陆151. 在150上面执行命令,当前登录用户是root: # s ...
- [SQL] SQL Server 触发器
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- Autodesk的照片建模云服务—Autodesk ReCap 360 photo 的测试数据
之前已经给大家介绍过了Autodesk的照片建模云服务—Autodesk ReCap 360 photo, 你也可以自己登录到http://recap360.autodesk.com/ 自己试一试. ...
- 通过Map 3D API读取线状要素的节点坐标
By Daniel Du 在Map 3D中可以使用Create from Geometry命令把AutoCAD实体转换成Map 3D中的FDO要素,比如可以把AutoCAD的polyline转换成FD ...
- Java输入/输出流体系
在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...