对于某个比较简单的算法,我们有时候确实能够精确地分析出算法的复杂度。

  比如算法复杂度为5n^2+10n+6,但是事实上并不需要这样,因为当n足够大时,可以忽略掉低阶项和最高次项的系数,因此就引出了“渐近复杂度”,并且用“渐近记号”来表示“渐近复杂度”。

  渐近记号包括:

符号 含义
O 渐进小于或等于
Ω 渐进大于或等于
Θ 渐进等于

  举例:

  如果a=x2+x,b=x2+5,则称a与b是相同等级的,且a渐进等于b;

  如果a=x2+x,b=x3+5,则称a与b不是相同等级的,且a渐进小于或等于b,b渐进大于或等于a。

  其中判断a和b是不是两个相同等级的,是依靠比较两个式子中自变量最高的次数,a=x2+x 中自变量最高次数为2,b=x3+5 中自变量最高次数为3。

  如果两个自变量的最高次数相同,则说明它们是相同等级的,即他们俩渐进相等,

  如果其中一个的次数比另一个高,则称次数低的一个式子渐进小于或等于次数高的式子,次数高的一个式子渐进大于或等于次数低的式子。

  注意不要关注他们的系数谁大谁小,现在用符号表示语言:

  a=x2+x,b=x2+5;   ====>    a=Θ(b);

  a=x2+x,b=x3+5;   ====>    a=O(b)  或者  b=Ω(a);

  其实,这个只要明白比较的是什么就能理解三个符号的含义及用法了。

  简记为:O表示上界,Ω表示下界,Θ表示平行。

 
性能测量工具

  Python自带了几个性能分析的模块:profile、cProfile和hotshot,使用方法基本都差不多,无非模块是纯Python还是用C写的。

cProfile的命令行用法

python -m cProfile XXX.py

输出到指定的文件:

python -m cProfile -o log.txt XXX.py

输出就被定向到了log.txt文件。

log.txt文件可以用VPT(http://visualpytune.googlecode.com)这样的图形工具打开。当log比较多的时候,可以很方便的进行过滤和时间的排序。

     2145 function calls (2058 primitive calls) in 0.301 seconds  

Ordered by: standard name  

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 _strptime.py:103(__calc_am_pm)
1 0.000 0.000 0.000 0.000 _strptime.py:115(__calc_date_time)
1 0.022 0.022 0.024 0.024 _strptime.py:12(<module>)
1 0.000 0.000 0.000 0.000 _strptime.py:160(__calc_timezone)
1 0.000 0.000 0.000 0.000 _strptime.py:176(TimeRE)
1 0.000 0.000 0.002 0.002 _strptime.py:179(__init__)
4 0.000 0.000 0.000 0.000 _strptime.py:212(<genexpr>)
6 0.000 0.000 0.000 0.000 _strptime.py:221(__seqToRE)
49 0.000 0.000 0.000 0.000 _strptime.py:236(<genexpr>)
4 0.000 0.000 0.001 0.000 _strptime.py:240(pattern)
1 0.000 0.000 0.001 0.001 _strptime.py:263(compile)

输出如上图,主要有:

  ncalls:函数被call的次数
  tottime:函数总的耗时,但是不包括其下的子函数的耗时
  percall:tottime平均到每次调用的耗时
  cumtime:函数总的耗时,包括了其子函数的耗时(递归函数也不例外)
  percall:cumtime平均到每次调用的耗时
  filename:lineno(function) :每个函数各自的信息

cProfile在Python代码中使用

import cProfile
cProfile.run('myfunction(arg1,arg2)', 'myfunction_prof')

使用以上的代码来引入cProfile, 并且使用其作为入口来调用待测函数。结果会放在myfunction_prof文件中。

这里再介绍一下结果文件在python下的阅读方法:

import pstats
p = pstats.Stats('myfunction_prof')
p.print_stats() # 可以设置排序方式,例如以花费时间多少排序
p.sort_stats('time').print_stats()

命令行中使用方法:

python -m pstats myfunction_prof

  

以上的内容,很容易在python的reference中找到,请参考:

http://docs.python.org/2/library/profile.html

【Python算法】渐进记法 与 性能测量工具cProfile的更多相关文章

  1. [python]用profile协助程序性能优化

    转自:http://blog.csdn.net/gzlaiyonghao/article/details/1483728 本文最初发表于恋花蝶的博客http://blog.csdn.net/lanph ...

  2. 渐进记法(O,Ω,Θ)

    第一次在<算法导论>中看到这三种渐进记法的符号,当时对此一窍不通,所以也就没有注意它们,直接把他们忽略了,知道学习算法的时候,才知道当初的做法有多傻,因为一个算法的好坏以及复杂度,可以用它 ...

  3. 安装Python算法库

    安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...

  4. MurmurHash算法:高运算性能,低碰撞率的hash算法

    MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...

  5. Python调用C模块以及性能分析

    一.c,ctypes和python的数据类型的对应关系 ctypes type ctype Python type c_char char 1-character string c_wchar wch ...

  6. python算法(一)

    python算法(一) 一.求数x的因子 x=100 divisors=()#初始化空的元组 for i in range(1,x): if x%i==0: divisors=divisors+(i, ...

  7. Python算法与数据结构--求所有子数组的和的最大值

    Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...

  8. Python算法:推导、递归和规约

    Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...

  9. Python算法(含源代码下载)

    关键字:Python Algorithms Python算法  Mastering Basic Algorithms in the Python Language 使用Python语言掌握基本算法 P ...

随机推荐

  1. 内存控制函数(1)-mmap() 建立内存映射

    示例1: 1.首先建立一个文本文件,名字为tmp,内容为hello world 2.编写mmap.c #include <sys/types.h> #include <sys/sta ...

  2. 《Kubernetes与云原生应用》系列之容器设计模式

    http://www.infoq.com/cn/articles/kubernetes-and-cloud-native-app-container-design-pattern <Kubern ...

  3. python爬虫解析库之re模块

    re模块 一:什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中, ...

  4. LINK : fatal error LNK1104

    今天本来想试试opencv的,于是就在自己的机子上部署一下试试,结果一直遇到这个错误:LINK : fatal error LNK1104 环境:win7 64位 vs2012 opencv 2.4. ...

  5. Ubuntu12.04 修复GRUB

    电脑安装了双系统,本来好好的GRUB管理启动,在重装过之后就只能进win7了,所以尝试将GRuB重新安装到mbr,使用GRUB作为启动管理程序. 1.制作U盘系统 使用软碟通,讲Ubuntu12.04 ...

  6. [C++]在什么时候需要“#include string.h“

    相关资料:https://zhidao.baidu.com/question/515578726.html C++中,string头文件基本上已经包含在iostream中了.但是,平时使用的时候建议加 ...

  7. Spring的AOP简单理解

    最近在研究spring的AOP,翻译出来的意思是面向切面. 总结如下: 所谓AOP就是将分散在各个方法处的公共代码提取到一处, 并通过类似拦截器的机制实现代码的动态整合.可以简单地想象成, 在某个方法 ...

  8. [driver]简单地hello驱动加载

    转自:http://blog.chinaunix.net/uid-24264134-id-98061.html Linux设备驱动会以内核模块的方式出现,因此,内核模块也成了我们编写驱动的入门知识,这 ...

  9. Am335x 应用层之SPI操作

    SPI接口有四种不同的数据传输时序,取决于CPOL和CPHL这两位的组合.图1中表现了这四种时序, 时序与CPOL.CPHL的关系也可以从图中看出. 图1 CPOL是用来决定SCK时钟信号空闲时的电平 ...

  10. PHP——动态随机数

    取1-13随机数 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...