好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python高性能编程方法一

阅读 Zen of Python,在Python解析器中输入 import this. 一个犀利的Python新手可能会注意到"解析"一词, 认为Python不过是另一门脚本语言. "它肯定很慢!"

11. 了解itertools模块:

该模块对迭代和组合是非常有效的。让我们生成一个列表[1,2,3]的所有排列组合,仅需三行Python代码:

>>> import itertools

>>> iter = itertools.permutations([1,2,3])

>>> list(iter)

[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

12. 学习bisect模块保持列表排序:

这是一个免费的二分查找实现和快速插入有序序列的工具。也就是说,你可以使用:

>>> import bisect

>>> bisect.insort(list, element)

你已將一个元素插入列表中, 而你不需要再次调用 sort() 来保持容器的排序, 因为这在长序列中这会非常昂贵.

13. 理解Python列表,实际上是一个数组:

Python中的列表实现并不是以人们通常谈论的计算机科学中的普通单链表实现的。Python中的列表是一个数组。也就是说,你可以以常量时间O(1) 检索列表的某个元素,而不需要从头开始搜索。这有什么意义呢? Python开发人员使用列表对象insert()时, 需三思. 例如:>>> list.insert(0,item)

在列表的前面插入一个元素效率不高, 因为列表中的所有后续下标不得不改变. 然而,您可以使用list.append()在列表的尾端有效添加元素. 挑先deque,如果你想快速的在两插入或时。它是快速的,因为在Python中的deque用双链表实现。不再多说。

14. 使用dict 和 set 测试成员: 检查一个元素是在dicitonary或set是否存在 这在Python中非常快的。这是因为dict和set使用哈希表来实现。查找效率可以达到O(1)。因此,如果您需要经常检查成员,使用 set 或 dict做为你的容器.

>>> mylist = ['a', 'b', 'c'] #Slower, check membership with list:

>>> ‘c’ in mylist

>>> True

>>> myset = set(['a', 'b', 'c']) # Faster, check membership with set:

>>> ‘c’ in myset:

>>> True

15. 使用Schwartzian Transform 的 sort():

原生的list.sort()函数是非常快的。 Python会按自然顺序排序列表。有时,你需要非自然顺序的排序。例如,你要根据服务器位置排序的IP地址。 Python支持自定义的比较,你可以使用list.sort(CMP()),这会比list.sort()慢,因为增加了函数调用的开销。如果性能有问 题,你可以申请Guttman-Rosler Transform,基于Schwartzian Transform. 它只对实际的要用的算法有兴趣,它的简要工作原理是,你可以变换列表,并调用Python内置list.sort() - > 更快,而无需使用list.sort(CMP() )->慢。

16. Python装饰器缓存结果:

“@”符号是Python的装饰语法。它不只用于追查,锁或日志。你可以装饰一个Python函数,记住调用结果供后续使用。这种技术被称为memoization的。下面是一个例子:

>>> from functools import wraps

>>> def memo(f):

>>> cache = { }

>>> @wraps(f)

>>> def wrap(*arg):

>>> if arg not in cache: cache['arg'] = f(*arg)

>>> return cache['arg']

>>> return wrap

我们也可以对 Fibonacci 函数使用装饰器:

>>> @memo

>>> def fib(i):

>>> if i

>>> return fib(i-1) + fib(i-2)

这里的关键思想是:增强函数(装饰)函数,记住每个已经计算的Fibonacci值;如果它们在缓存中,就不需要再计算了.

17. 理解Python的GIL(全局解释器锁):

GIL是必要的,因为CPython的内存管理是非线程安全的。你不能简单地创建多个线程,并希望Python能在多核心的机器上运行得更快。这是因为 GIL將会防止多个原生线程同时执行Python字节码。换句话说,GIL將序列化您的所有线程。然而,您可以使用线程管理多个派生进程加速程序,这些程 序独立的运行于你的Python代码外。

18. 像熟悉文档一样的熟悉Python源代码:

Python有些模块为了性能使用C实现。当性能至关重要而官方文档不足时,可以自由探索源代码。你可以找到底层的数据结构和算法。 Python的源码库就是一个很棒的地方:http://svn.python.org/view/python/trunk/Modules

结论:

这些不能替代大脑思考. 打开引擎盖充分了解是开发者的职责,使得他们不会快速拼凑出一个垃圾设计. 本文的Python建议可以帮助你获得好的性能. 如果速度还不够快, Python將需要借助外力:分析和运行外部代码.我们將在本文的第二部分中涉及.

查看更多关于python高性能编程方法一的详细内容...

  阅读:39次