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)

基本思想是增强(装饰)您的函数,以便记住您计算的每个斐波那契项,如果它们在缓存中,则无需再次计算。

更新于: 2019-07-30

250 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告