python性能优化
python为什么性能差:
从上图可以看出,不同的case,python比C++慢了几倍到几十倍。
Be pythonic
- 使用迭代器iterator,for example:
- 判断是否是同一个对象使用 is 而不是 ==
- 判断一个对象是否在一个集合中,使用set而不是list
- 利用短路求值特性,把“短路”概率过的逻辑表达式写在前面。其他的lazy ideas也是可以的
- 对于大量字符串的累加,使用join操作
- 使用for else(while else)语法
- 交换两个变量的值使用: a, b = b, a
基于profile的优化
python profilers
# -*- coding: UTF-8 -*- from cProfile import Profile
import math
def foo():
return foo1() def foo1():
return foo2() def foo2():
return foo3() def foo3():
return foo4() def foo4():
return "this call tree seems ugly, but it always happen" def bar():
ret = 0
for i in xrange(10000):
ret += i * i + math.sqrt(i)
return ret def main():
for i in range(100000):
if i % 10000 == 0:
bar()
else:
foo() if __name__ == '__main__':
prof = Profile()
prof.runcall(main)
prof.print_stats()
#prof.dump_stats('test.prof') # dump profile result to test.prof
code for profile
运行结果如下:

对于上面的的输出,每一个字段意义如下:
profile GUI tools

qcachegrind确实要比visualpytune强大。从上图可以看到,大致分为三部:。第一部分同visualpytune类似,是每个函数占用的时间,其中Incl等同于cumtime, Self等同于tottime。第二部分和第三部分都有很多标签,不同的标签标示从不同的角度来看结果,如图上所以,第三部分的“call graph”展示了该函数的call tree并包含每个子函数的时间百分比,一目了然。
profile针对优化
跟之前的结果对比:

可以看到,优化了差不多3倍。
case 1:a, b = SomeClass(), SomeClass()a.b, b.a = b, acase 2:lst = []lst.append(lst)case 3:self.handler = self.some_func
要解决循环引用,第一个办法是使用弱引用(weakref),第二个是手动解循环引用。
class BaseSlots(object):
__slots__ = ['e', 'f', 'g'] class Slots(BaseSlots):
__slots__ = ['a', 'b', 'c', 'd']
def __init__(self):
self.a = self.b = self.c = self.d = self.e = self.f = self.g = 0 class BaseNoSlots(object):
pass class NoSlots(BaseNoSlots):
def __init__(self):
super(NoSlots,self).__init__()
self.a = self.b = self.c = self.d = self.e = self.f = self.g = 0 def log_time(s):
begin = time.time()
for i in xrange(10000000):
s.a,s.b,s.c,s.d, s.e, s.f, s.g
return time.time() - begin if __name__ == '__main__':
print 'Slots cost', log_time(Slots())
print 'NoSlots cost', log_time(NoSlots())
输出结果:
Slots cost 3.12999987602
NoSlots cost 3.48100018501
python C扩展
beyond CPython
cython
pip install Cython
下面是测试用的python代码,可以看到这两个case都是运算复杂度比较高的例子:
# -*- coding: UTF-8 -*-
def f(x):
return x**2-x def integrate_f(a, b, N):
s = 0
dx = (b-a)/N
for i in range(N):
s += f(a+i*dx)
return s * dx def main():
import time
begin = time.time()
for i in xrange(10000):
for i in xrange(100):f(10)
print 'call f cost:', time.time() - begin
begin = time.time()
for i in xrange(10000):
integrate_f(1.0, 100.0, 1000)
print 'call integrate_f cost:', time.time() - begin if __name__ == '__main__':
main()
- step1:将文件名(cython_example.py)改为cython_example.pyx
- step2:增加一个setup.py文件,添加一下代码:
from distutils.core import setup
from Cython.Build import cythonize setup(
name = 'cython_example',
ext_modules = cythonize("cython_example.pyx"),
)
- step3:执行python setup.py build_ext --inplace

- step4:执行命令 python -c "import cython_example;cython_example.main()"(注意: 保证当前环境下已经没有 cython_example.py)
def f(double x): # 参数静态类型
return x**2-x def integrate_f(double a, double b, int N):
cdef int i
cdef double s, dx
s = 0
dx = (b-a)/N
for i in range(N):
s += f(a+i*dx)
return s * dx
然后重新运行上面的第三 四步:结果如下
cdef double f(double x): # 返回值也有类型判断
return x**2-x cdef double integrate_f(double a, double b, int N):
cdef int i
cdef double s, dx
s = 0
dx = (b-a)/N
for i in range(N):
s += f(a+i*dx)
return s * dx
pypy
在实际项目中测试,pypy大概比cpython要快3到5倍!pypy的性能提升来自JIT Compiler。在前文提到google的Unladen Swallow 项目也是想在CPython中引入JIT,在这个项目失败后,很多开发人员都开始加入pypy的开发和优化。另外pypy占用的内存更少,而且支持stackless,基本等同于协程。
ChangeLog
references
python性能优化的更多相关文章
- Python性能优化(转)
分成两部分:代码优化和工具优化 原文:http://my.oschina.net/xianggao/blog/102600 阅读 Zen of Python,在Python解析器中输入 import ...
- Python性能优化方案
Python性能优化方案 从编码方面入手,代码算法优化,如多重条件判断有限判断先决条件(可看 <改进python的91个建议>) 使用Cython (核心算法, 对性能要求较大的建议使用C ...
- Python性能优化:PyPy、Numba 与 Cython。PyPy的安装及对应pip的安装
性能优化讨论见参考1:大概意思是,PyPy内置JIT,对纯Python项目兼容性极好,几乎可以直接运行并直接获得性能提升:缺点是对很多C语言库支持性不好.Numba是一个库,可以在运行时将Python ...
- Python性能优化的20条建议 (转载)
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...
- python 性能优化
1.优化循环 循环之外能做的事不要放在循环内,比如下面的优化可以快一倍 2.使用join合并迭代器中的字符串 join对于累加的方式,有大约5倍的提升 3.使用if is 使用if is True比i ...
- python基础===Python性能优化的20条建议
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...
- python性能优化建议
参考: https://segmentfault.com/a/1190000000666603 http://blog.csdn.net/zhoudaxia/article/details/23853 ...
- Python性能优化的20条建议
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...
- python性能优化、内存优化、内存泄露;与其他语音比较效率如何?
1.内存泄露:http://www.cnblogs.com/xybaby/p/7491656.html 2.内存优化:http://www.cnblogs.com/xybaby/p/7488216.h ...
随机推荐
- C标准I/O建立一个文件仓库
实现了 增删改查 创建了一个结构体 保存 num name cout price 代码 #include<stdio.h>#include<string.h>#include& ...
- Java打印
Java打印 import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Gra ...
- HDU1848-Fibonacci again and again
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1848 这个题目代码不是很复杂,但那个等价类,(SG函数)没怎么理解, 题目难,不过代码不怎么复杂,在网 ...
- apache 运行php环境之困扰,无法加载多个不同的.html文件
又是一个项目,为多个纯静态html页面h5游戏页,原本是一个简单得不能的项目,但是却多生了事端. 我按照apache的惯例,将文件上传到服务器的DocumentRoot目录,进行测试了. 刚开始使用目 ...
- 微信扫码下载APP
前段时间开发过程中,要实现一个扫描二维码下载APP的功能,但是苹果系统中,微信不可以直接跳转苹果商店,需要先下载应用宝,显然太麻烦... 这样我们可以做个中间页,用中间页面生成二维码链接,在中间页代码 ...
- Nancy简单实战之NancyMusicStore(二):打造首页
前言 继上一篇搭建好项目之后,我们在这一篇中将把我们NancyMusicStore的首页打造出来. 布局 开始首页之前,我们要先为我们的整个应用添加一个通用的布局页面,WebForm中母版页的概念. ...
- Oracle 12cR1 RAC 在VMware Workstation上安装(上)—OS环境配置
Oracle 12cR1 RAC 在VMware Workstation上安装(上)-OS环境配置 1.1 整体规划部分 1.1.1 所需软件介绍 Oracle RAC不支持异构平台.在同一个集群 ...
- 为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务
昨天测试开发微信小程序,才发现微信也要求用HTTPS加密数据,想来是由于之前苹果的ATS审核政策的缘故吧,微信想在苹果上开放小程序必然也只能要求开发者必须使用HTTPS了,于是在服务器上测试安装Ngi ...
- 私有云存储搭建(owncloud)
第一步.搭建LAMP(基于linux7.1.1503) 1 配置yum(网络加本地,下面为网络) [vault.centos.org_7.1.1503_os_x86_64_] name=added f ...
- (四)Hololens Unity 开发之 凝视系统
学习源于官方文档 Gaze in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 HoloLens 有三大输入系统,凝视点.手势和声音 ~ 本文主要记录凝视 ...