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协议族 ...
随机推荐
- ScrollMe – 在网页中加入各种滚动动画效果
ScrollMe 是一款 jQuery 插件,用于给网页添加简单的滚动效果.当你向下滚动页面的时候,ScrollMe 可以缩放,旋转和平移页面上的元素.它易于设置,不需要任何自定义的 JavaScri ...
- EventRay UI Kit – Web & Mobile 的素材
EventRay UI 工具包是一个免费的,可以现成使用的界面套件.包括多个为 Web 和移动应用设计的布局和 UI 元素.所有你需要做的就是下载这个 UI 工具包,点击源码下载打开的页面即可下载. ...
- web页面直接跳转至其他页面
<script type="text/javascript">window.location.herf="../../XXXXX.aspx";< ...
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...
- 用(*.frm *.MYD *.MYI)文件恢复MySql数据库
保存下来以防以后遇到 今天还原mysql数据库时,看到那个data文件夹下好几个文件,还没有.sql文件,没有见过,总结下.Data文件夹里面包括:数据库名文件夹,文件夹里包括,*.frm,*.MYI ...
- 【代码笔记】iOS-给背景图赋值颜色
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...
- Android源码笔记——Camera系统架构
Camera的架构与Android系统的整体架构保持一致,如下图所示,本文主要从以下四个方面对其进行说明. Framework:Camera.java Android Runtime:android_ ...
- Genome2D编译方法
Genome2D是一个高效的2D引擎,现在支持Flash(stage3d)和HTML5,因为只有作者一个人在维护,就没开源代码. 最近和作者沟通了下,已经开源啦. 作者划分了几个模块,编译起来不是特别 ...
- 史上最详细“截图”搭建Hexo博客并部署到Github
http://jingyan.baidu.com/article/d8072ac47aca0fec95cefd2d.html 大家也搭建过博客,很多时候,按着教程来做就可以了,但是我当时为了搭建Hex ...
- SQL Server(七)——存储过程
一.概述 存储过程是一组编译在单个执行计划中的T-SQL语句 存储过程:就像函数一样的会保存在数据库中(可编程性) 存储过程的优点: 1.允许模块化程序设计 2.允许更快执行如果某操作需要大量T-SQ ...