Python是一种具有动态语义的解释型,面向对象的高级编程语言。它的高级内置数据结构与动态类型和动态绑定相结合,使其对于快速应用程序开发以及用作将现有组件连接在一起的脚本语言或粘合语言非常有吸引力。
Python是一种非常流行的语言。它也是我为初学者推荐的语言之一。但是,如何学习这种语言呢?
这是一些很酷的python技巧:
选择内置函数:您可以用Python编写高效的代码,但是很难超越内置函数(用C编写)。
使用join()粘合大量字符串:可以使用“ +”组合多个字符串。由于字符串在Python中是不可变的,因此每个“ +”操作都涉及创建一个新字符串并复制旧内容。一个常见的习惯用法是使用Python的数组模块来修改单个字符。完成后,使用join()函数重新创建最终字符串。
使用Python的多个分配交换变量:
这在Python中既优雅又快速:
>>> x,y = y,x
这比较慢:
>>> temp = x
>>> x = y
>>> y = temp
4. 尽可能使用局部变量:
Python检索局部变量比检索全局变量更快。也就是说,避免使用“ global”关键字。
5. 尽可能使用“ in”:
要总体上检查成员资格,请使用“ in”关键字。它干净又快速。
>>> for key in sequence (按顺序输入)
>>> print “found”
6. 通过延迟导入加快速度:
将“ import”语句移至函数中,以便仅在必要时使用import。换句话说,如果不需要立即使用某些模块,请稍后再导入它们。例如,您可以通过在启动时不导入一长串模块来加速程序。此技术不会增强整体性能。它可以帮助您更均匀地分配模块的加载时间。
7. 将“ while 1”用于无限循环:
有时您希望程序中出现无限循环。(例如,侦听套接字)即使“ while True”完成相同的功能,“ while 1”也是单个跳转操作。将此技巧应用于高性能Python代码。
>>> while 1:
>>> #do stuff, faster with while 1
>>> while True:
>>> # do stuff, slower with wile True
8. 使用列表理解:
从Python 2.0开始,您可以使用列表推导来替换许多“ for”和“ while”块。列表理解速度更快,因为它已针对Python解释器进行了优化,以在循环期间发现可预测的模式。另外,列表理解可能更易读(功能编程),并且在大多数情况下,它为您节省了一个额外的变量供计数。例如,让我们用一行获得1到10之间的偶数:
>>> # the good way to iterate a range (迭代范围的好方法)
>>> evens = [ i for i in range(10) if i%2 == 0]
>>> [0, 2, 4, 6, 8]
>>> # the following is not so Pythonic
>>> i = 0
>>> evens = []
>>> while i < 10:
>>> if i %2 == 0: evens.append(i)
>>> i += 1
>>> [0, 2, 4, 6, 8]
9. 对很长的序列使用range():
这样可以节省大量系统内存,因为range()一次只能在一个序列中产生一个整数元素。与range()相反,它为您提供了完整的列表,这对于循环来说是不必要的开销。
10. 使用Python生成器按需获取价值:
这也可以节省内存并提高性能。如果您正在流式传输视频,则可以发送大块字节,但不能发送整个流。
11. 了解Python列表实际上是一个数组:
Python中的列表未实现为人们在计算机科学中谈论的通常的单链接列表。Python中的列表是一个数组。也就是说,您可以使用具有恒定时间O(1)的索引来检索列表中的元素,而无需从列表的开头进行搜索。这意味着什么?当在列表对象上使用insert()时,Python开发人员应该考虑一下。例如:>>> list.insert(0,element)
当在最前面插入一个元素时,效率不高,因为列表中所有后续索引都必须更改。但是,您可以使用list.append()将元素高效地附加到列表的末尾。但是,如果要在两端快速插入或移除,请选择双端队列。速度很快,因为Python中的双端队列是作为双链表实现的。
14. 使用字典并设置为测试成员资格:
Python非常快速地检查字典或集合中是否存在某个元素。这是因为字典和集合是使用哈希表实现的。查找速度可以与O(1)一样快。因此,如果您需要经常检查成员资格,请使用字典或将其设置为容器。
>>> 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. 使用Python装饰器缓存结果:
符号“ @”是Python装饰器语法。不仅将其用于跟踪,锁定或记录。您可以装饰一个Python函数,以便它记住以后需要的结果。这种技术称为记忆。这是一个例子:
>>> 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 < 2: return 1
>>> return fib(i-1) + fib(i-2)
这里的关键思想很简单:增强(装饰)功能以记住您计算出的每个斐波纳契项;如果它们在缓存中,则无需再次计算。
16. 了解Python GIL(全局解释器锁):
GIL是必要的,因为CPython的内存管理不是线程安全的。您不能简单地创建多个线程,并希望Python在多核计算机上运行得更快。这是因为GIL将阻止多个本机线程一次执行Python字节码。换句话说,GIL将序列化所有线程。但是,您可以通过使用线程来管理多个分叉的进程来加速程序,这些分叉的进程在Python代码之外独立运行。
17. 将Python源代码视为您的文档:
Python具有用C实现的模块,以提高速度。当性能至关重要并且官方文档不够用时,请随时自己探索源代码。您可以找到底层的数据结构和算法。Python存储库是一个绝佳的选择!