有人跟我抱怨说 python 太慢了, 然后我就将 python 健步如飞的六大技巧传授给他, 结果让他惊呆了, 你也想知道这个秘诀吗? 这就告诉你:
Python 是一门优秀的语言, 它能让你在短时间内通过极少量代码就能完成许多操作. 不仅如此, 它还轻松支持多任务处理, 比如多进程.
因为 GIL 的存在, Python 很难充分利用多核 CPU 的优势. 但是, 可以通过内置的模块 multiprocessing 实现下面几种并行模式:
多进程并行编程
对于 CPU 密集型的程序, 可以使用 multiprocessing 的 Process,Pool 等封装好的类, 通过多进程的方式实现并行计算. 但是因为进程中的通信成本比较大, 对于进程之间需要大量数据交互的程序效率未必有大的提高.
多线程并行编程
对于 IO 密集型的程序, multiprocessing.dummy 模块使用 multiprocessing 的接口封装 threading, 使得多线程编程也变得非常轻松(比如可以使用 Pool 的 map 接口, 简洁高效). 分布式: multiprocessing 中的 Managers 类提供了可以在不同进程之共享数据的方式, 可以在此基础上开发出分布式的程序. 不同的业务场景可以选择其中的一种或几种的组合实现程序性能的优化.
优化算法时间
法的时间复杂度对程序的执行效率影响最大, 在 Python 中可以通过选择合适的数据结构来优化时间复杂度, 如 list 和 set 查找某一个元素的时间复杂度分别是 O(n)和 O(1). 不同的场景有不同的优化方式, 总得来说, 一般有分治, 分支界限, 贪心, 动态规划等思想.
例如: set 的用法
set 的 union,intersection,difference 操作要比 list 的迭代要快. 因此如果涉及到求 list 交集, 并集或者差的问题可以转换为 set 来操作.
针对循环的优化
每种编程语言都会强调需要优化循环. 当使用 Python 的时候, 你可以依靠大量的技巧使得循环运行得更快. 然而, 开发者经常漏掉的一个方法是: 避免在一个循环中使用点操作. 例如, 考虑下面的代码:
每一次你调用方法 str.upper,Python 都会求该方法的值. 然而, 如果你用一个变量代替求得的值, 值就变成了已知的, Python 就可以更快地执行任务. 优化循环的关键, 是要减少 Python 在循环内部执行的工作量, 因为 Python 原生的解释器在那种情况下, 真的会减缓执行的速度.
函数选择
在循环的时候使用 xrange 而不是 range; 使用 xrange 可以节省大量的系统内存, 因为 xrange()在序列中每次调用只产生一个整数元素. 而 range()將直接返回完整的元素列表, 用于循环时会有不必要的开销. 在 python3 中 xrange 不再存在, 里面 range 提供一个可以遍历任意长度的范围的 iterator.
使用性能分析工具
除了上面在 ipython 使用到的 timeit 模块, 还有 cProfile.cProfile 的使用方式也非常简单: python-m cProfile filename.py,filename.py 是要运行程序的文件名, 可以在标准输出中看到每一个函数被调用的次数和运行的时间, 从而找到程序的性能瓶颈, 然后可以有针对性地优化.
来源: http://developer.51cto.com/art/201807/579034.htm