【Python算法】渐进记法 与 性能测量工具cProfile
对于某个比较简单的算法,我们有时候确实能够精确地分析出算法的复杂度。
比如算法复杂度为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的更多相关文章
- [python]用profile协助程序性能优化
转自:http://blog.csdn.net/gzlaiyonghao/article/details/1483728 本文最初发表于恋花蝶的博客http://blog.csdn.net/lanph ...
- 渐进记法(O,Ω,Θ)
第一次在<算法导论>中看到这三种渐进记法的符号,当时对此一窍不通,所以也就没有注意它们,直接把他们忽略了,知道学习算法的时候,才知道当初的做法有多傻,因为一个算法的好坏以及复杂度,可以用它 ...
- 安装Python算法库
安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...
- MurmurHash算法:高运算性能,低碰撞率的hash算法
MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...
- Python调用C模块以及性能分析
一.c,ctypes和python的数据类型的对应关系 ctypes type ctype Python type c_char char 1-character string c_wchar wch ...
- python算法(一)
python算法(一) 一.求数x的因子 x=100 divisors=()#初始化空的元组 for i in range(1,x): if x%i==0: divisors=divisors+(i, ...
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- Python算法:推导、递归和规约
Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...
- Python算法(含源代码下载)
关键字:Python Algorithms Python算法 Mastering Basic Algorithms in the Python Language 使用Python语言掌握基本算法 P ...
随机推荐
- Xamarin for VS 4.0.1.145 Stable版免费完整破解补丁
Xamarin for VS 4.0.1.145 Stable版免费完整破解补丁 支持Priority最高权限(超企业版)开发, 支持Android, IOS调试. 支持Android打包为Bund ...
- session监听器HttpSessionBindingListener
首先我在网上查了一下session的真正销毁条件: 1调用 session.invalidate();方法 2 session到了设置或者默认的超时时间,自动销毁(关闭浏览器此session还未销毁, ...
- w3c html dom
http://www.w3school.com.cn/ SQL语句学习 http://www.w3school.com.cn/sql/sql_like.asp
- RabbitMQ之任务队列【译】
在第一个教程里面,我们写了一个程序从一个有名字的队列中发送和接收消息,在这里我们将要创建一个分发耗时任务给多个worker的任务队列. 任务队列核心思想就是避免执行一个资源密集型的任务,而程序要等待其 ...
- op bug 修复计划
省-市-区-组-成员 多了一个组的下拉框,说不清它和区的联系 把它删掉,它的点击事件(把组的id和内容传给隐形的text,text通过ajax提交到数据库)给区下面的组
- linux改动登陆主机提示信息
寻常管理着130多台Linux物理主机.真正搞清楚每一台主机的IP信息.应用部署比較麻烦! 所以在部署之初,必须规划好: 写一个脚本.把主机IP.管理员联系方法,应用部署等主机信息放在.sh里面 sh ...
- MTP(Media Transfer Protocol(媒体传输协议))简介
---恢复内容开始--- 1,简单说明 MTP,微软公司规定的新的传输规则(字面本来应该是协议的,但是自己感觉更像是规则,制定了基本上的所有路线,剩下的是你想怎么选择罢了,使用者完全没有可能在它的框架 ...
- LPCTSTR —— 摘自百度百科
LPCTSTR用来表示字符是否使用UNICODE. 如果程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串. 类型理解:L,表示 ...
- uva 707(记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21261 思路:此题需要记忆化搜索,dp[x][y][t]表示当前状 ...
- angularjs1+nodejs搭建的个人博客 实战个人项目
项目地址:https://github.com/MrZwqShuai/Micro-agency-Demo