编写_高性能_Python代码

+16

No comments posted yet

Comments

zbing3 (4 years ago)

1

Slide 1

编写“高性能”Python代码 raymondzhu@tencent.com GitHub: @piglei

Slide 2

前言 为什么是“高性能” Python(CPython)的速度

Slide 3

主要内容 如何找出代码性能瓶颈 Python的一些性能tips 其他和性能相关的内容杂谈 性能调优是一个非常庞大的主题,这儿无法涵盖所有方面,重要的是分享思路

Slide 4

找出瓶颈 优化的第一步:找出瓶颈 永远不要去猜代码的性能瓶颈 瓶颈经常会出现在你想不到的地方 json.dumps(data) 会成为你的代码瓶颈吗? 当data异常庞大时...

Slide 5

找出瓶颈 使用专业工具 profile/cprofile line_profile(https://github.com/rkern/line_profiler) ipython: %prun

Slide 6

比较方案 使用工具来比较方案的好坏 import timeit timeit.Timer(…).timeit() ipython: %timeit

Slide 7

编写高性能Python代码 优化你的代码 使用更快的工具 超越CPython

Slide 8

优化你的代码 合理使用内置数据类型 判断元素是否在其中 131 µs 190 ns 700x faster!

Slide 9

优化你的代码 懒惰计算 range vs xrange 30.1 ms 17.3 ms 1.74x faster!

Slide 10

优化你的代码 正则表达式 不要忘了编译 re.compile 2.68 µs 1.69 µs 1.58X faster!

Slide 11

优化你的代码 简单的字符串处理 有时候简单的字符串处理会更快 850 ns 2X faster!

Slide 12

优化你的代码 列表迭代 vs for循环 819 µs 1.12 ms 1.36x faster

Slide 13

优化你的代码 不可忽视的函数调用开销 1.42 ms 558 µs 2.54x faster

Slide 14

优化你的代码 局部变量的访问速度会比较快(import dis看看) .sort(key=xxx) vs .sort(cmp=xxx) 尽量使用key,因为它拥有更好的性能。(为什么?)

Slide 15

使用更快的工具 充分利用优秀的内建模块 deque / bisect / heapq / collections … 24.1 ms 1.02 ms 23.6X faster! heapq.nlargest(number, l)

Slide 16

使用更快的工具 尝试使用更快速的第三方模块 c实现的比pure python的要快 cPickle vs pickle / StringIO vs cStringIO … 或者自己实现extension CPython API Cython: Python的语法,C的性能

Slide 17

超越CPython pypy JIT (Just-in-Time compiler) pyston by Dropbox(https://github.com/dropbox/pyston) …

Slide 18

代码之外

Slide 19

并行的魅力 现在是多核的时代 multithreading 无处不在的GIL 无法充分利用多核资源,适用范围有限 使用多进程 multiprocessing concurrent.futures

Slide 20

异步IO 支撑高并发应用的关键 异步网络框架:Python的问题是选择太多 callback: twisted / tornado coroutine: eventlet / greenlet / stackless python 挑选最适合你的

Slide 21

千万别忘了缓存 缓存无处不在 “最快的代码是什么都不干的代码” 不变动的结果永远只计算一次 让人头疼的缓存过期问题 也许我们下次可以好好聊聊缓存

Slide 22

最后的话 “Premature optimization is the root of all evil” -- DonaldKnuth

Slide 23

Q & A 欢迎任何问题!

Tags: python

URL: