Python 代码优化技巧?
虽然我们都知道 Python 的速度和效率不如其他编译型语言。但是,许多大型公司向我们展示了 Python 代码可以处理更大的工作负载,这表明它并不慢。在本节中,我们将了解一些应该牢记的技巧,以便正确的 Python 程序运行得更快、更高效。
技巧 1:使用内置函数
虽然我们可以在 Python 中编写高效的代码,但很难超越内置函数(用 C 语言编写)。下图显示了 Python 内置函数的列表。
技巧 2:使用 Python 多重赋值交换变量
>>> #Instead of using >>> x, y = y, x >>> #Use this - which is much faster >>> temp = x >>> x = y >>> y = temp
技巧 3:避免使用全局变量,如果可能,使用局部变量
在检索局部变量时,Python 比检索全局变量快。也就是说,如果可能,避免使用全局变量。
技巧 4:尽可能使用 “in”
要检查成员资格,请使用 “in” 关键字。它简洁且快速。
for key in sequence: print ("Hello ", key)
技巧 5:使用 “while 1” 进行无限循环
有时我们需要在程序中运行无限循环(例如,侦听套接字)。虽然 “while True” 会执行相同的操作,但 “while 1” 只是一个简单的跳转操作。
>>> while 1: # do something, faster with while 1 >>> while True: #do something, perform same operation but slower than then previous one
技巧 6:使用列表推导式
从 Python 2.0 开始,我们可以使用列表推导式来替换许多 “for” 和 “while” 代码块。列表推导式速度更快,因为它经过优化,Python 解释器可以在循环过程中识别可预测的模式。它更易读,并且在大多数情况下,它可以节省一个用于计数的额外变量。
例如,用一行代码查找 1 到 25 之间的偶数
>>> #Using list comprehension - good way >>> print([i for i in range (25) if i%2 == 0]) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24] >>> # Another way - not so efficient way i = 0 evens = [] while i< 25: if i%2 == 0: evens.append(i) i += 1 print(evens) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24]
技巧 7:使用 Python 生成器按需获取值
使用 Python 生成器可以节省内存并提高性能。如果您正在流式传输视频,则可以发送字节块,而不是整个流。
>>> chunkBytes = (1000 * i for i in range(1000)) >>> next(chunkBytes) 0 >>> next(chunkBytes) 1000 >>> next(chunkBytes) 2000 >>> next(chunkBytes) 3000 >>>
技巧 8:使用 itertools 模块
itertools 模块对于迭代和组合非常有用且高效。
用几行 Python 代码生成列表 [1, 2, 3, 4, 5] 的所有排列
>>> import itertools >>> iter1 = itertools.permutations([1, 2, 3,4]) >>> list(iter1) [(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 1, 2, 4), (3, 1, 4, 2), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 1, 2, 3), (4, 1, 3, 2), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)]
技巧 9:使用 bisect 模块保持列表排序
它是一个免费的二分查找实现,也是排序序列的快速插入工具。
>>> import bisect >>> bisect.insort(list, element)
我们将元素插入到列表中,现在无需再次调用 sort() 来保持容器排序,这在长序列上可能非常耗时。
技巧 10:使用字典和集合测试成员资格
由于字典和集合是使用哈希表实现的,因此检查元素是否在字典或集合中存在于 Python 中非常快。有时查找速度可以达到 O(1)。
>>> lst = ['a', 'ab', 'abc'] #Slow - Checking membership with list >>> 'abc' in lst True >>> mySet = set(['a', 'ab', 'abc'])# Fast - checking membership with set or dictionary >>> 'abc' in mySet True
技巧 11:使用 Python 装饰器缓存结果
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
我们可以将此装饰器用于斐波那契函数
>>> @memo def fib(i): if i<2: return 1 return fib(i-1) + fib(i-2)
基本思想是增强(装饰)您的函数,以便记住您计算的每个斐波那契项,如果它们在缓存中,则无需再次计算。