提高 Python 运行速度的 8 个优化技巧

图片[1]-提高 Python 运行速度的 8 个优化技巧-山海云端论坛

Python 作为一种灵活而强大的脚本语言,在很多场景下都能发挥出色的效果。然而,与编译语言相比,Python 在一些性能方面可能稍显不足。本文将介绍一些优化 Python 代码运行速度的技巧,帮助你提高代码的效率。

0. 代码优化的基本原则

在深入介绍优化技巧之前,让我们先了解一些代码优化的基本原则:

第一个原则:不要过早优化。 在开发初期,先确保代码的正确性,优化应该放在后面,只有在确定代码存在性能问题时才进行优化。

第二个原则:权衡优化的代价。 优化往往需要付出一定的代价,需要综合考虑时间、空间和开发成本。

第三个原则:不要优化无关紧要的部分。 优化应该集中在影响整体性能的关键部分,而不是一味地对所有代码进行优化。

现在,让我们来看看一些具体的优化技巧。

1. 避免全局变量

定义在全局范围内的代码运行速度较慢,因此将代码放入函数中可以提升运行速度。

<code># 不推荐写法 import math size = 10000 for x in range(size): for y in range(size): z = math.sqrt(x) + math.sqrt(y) # 推荐写法 import math def main(): size = 10000 for x in range(size): for y in range(size): z = math.sqrt(x) + math.sqrt(y) main()</code>

2. 避免属性和模块访问

避免使用属性访问操作符.时,采用from import语句;在函数内部使用局部变量代替属性和模块访问。

<code># 不推荐写法 import math def computeSqrt(size: int): result = [] for i in range(size): result.append(math.sqrt(i)) return result # 推荐写法 from math import sqrt def computeSqrt(size: int): result = [] for i in range(size): result.append(sqrt(i)) return result</code>

3. 避免不必要的抽象

尽量避免使用额外的处理层(如装饰器、属性访问、描述器);对于简单的属性访问,使用简单属性访问语法。

<code># 不推荐写法 class DemoClass: def __init__(self, value: int): self.value = value @property def value(self) -> int: return self._value @value.setter def value(self, x: int): self._value = x # 推荐写法 class DemoClass: def __init__(self, value: int): self.value = value # 避免不必要的属性访问器</code>

4. 避免数据复制

4.1 避免无意义的数据复制

减少不必要的数据复制操作,尽量避免创建不必要的数据结构。

<code># 不推荐写法 def main(): size = 10000 for _ in range(size): value = range(size) value_list = [x for x in value] square_list = [x * x for x in value_list] # 推荐写法 def main(): size = 10000 for _ in range(size): value = range(size) square_list = [x * x for x in value] # 避免无意义的复制</code>

4.2 交换值时不使用中间变量

在交换两个变量的值时,不需要使用额外的中间变量,可以直接进行赋值操作。

<code># 不推荐写法 def main(): size = 1000000 for _ in range(size): a = 3 b = 5 temp = a a = b b = temp # 推荐写法 def main(): size = 1000000 for _ in range(size): a = 3 b = 5 a, b = b, a # 不借助中间变量</code>

4.3 字符串拼接用join而不是+

使用join()方法拼接字符串,而不是使用+操作符,因为+操作符会创建多个中间结果,而join()方法只会创建一个结果。

<code># 不推荐写法 import string from typing import List def concatString(string_list: List[str]) -> str: result = '' for str_i in string_list: result += str_i return result # 推荐写法 import string from typing import List def concatString(string_list: List[str]) -> str: return ''.join(string_list) # 使用 join 而不是 +</code>

5. 利用if条件的短路特性

利用 if 条件语句的短路特性,将可能性比较高的条件写在前面,可以提高运行速度。

<code># 不推荐写法 from typing import List def concatString(string_list: List[str]) -> str: abbreviations = {'cf.', 'e.g.', 'ex.', 'etc.', 'flg.', 'i.e.', 'Mr.', 'vs.'} result = '' for str_i in string_list: if str_i in abbreviations: result += str_i return result # 推荐写法 from typing import List def concatString(string_list: List[str]) -> str: abbreviations = {'cf.', 'e.g.', 'ex.', 'etc.', 'flg.', 'i.e.', 'Mr.', 'vs.'} result = '' for str_i in string_list: if str_i[-1] == '.' and str_i in abbreviations: # 利用 if 条件的短路特性 result += str_i return result</code>

6. 循环优化

6.1 用for循环代替while循环

Python 的for循环通常比while循环更快。

<code># 不推荐写法 def computeSum(size: int) -> int: sum_ = 0 i = 0 while i < size: sum_ += i i += 1 return sum_ # 推荐写法 def computeSum(size: int) -> int: sum_ = 0 for i in range(size): # for 循环代替 while 循环 sum_ += i return sum_</code>

6.2 使用隐式for循环代替显式for循环

隐式的for循环更加简洁,也更快。

<code># 推荐写法 def computeSum(size: int) -> int: return sum(range(size)) # 隐式 for 循环代替显式 for 循环</code>

6.3 减少内层for循环的计算

将内层循环中的重复计算提取到外层,减少重复计算的次数。

<code># 不推荐写法 import math def main(): size = 10000 for x in range(size): for y in range(size): z = math.sqrt(x) + math.sqrt(y) # 推荐写法 import math def main(): size = 10000 sqrt = math.sqrt for x in range(size): sqrt_x = sqrt(x) # 减少内层 for 循环的计算 for y in range(size): z = sqrt_x + sqrt(y)</code>

7. 使用 numba.jit

numba 可以将 Python 函数 JIT(即时编译)为机器码执行,从而提高代码运行速度。

<code># 推荐写法 import numba @numba.jit def computeSum(size: float) -> int: sum_ = 0 for i in range(size): sum_ += i return sum_ def main(): size = 10000 for _ in range(size): sum_ = computeSum(size)</code>

8. 选择合适的数据结构

Python 内置的数据结构通常速度很快,自己实现的新数据结构很难达到相同的性能水平。

针对特定的需求,选择合适的数据结构可以提高代码的效率。比如,使用 collections.deque 代替列表进行频繁的新增、删除操作,使用 bisect 进行二分查找,使用 heapq 实现堆操作等。

通过以上优化技巧,可以显著提高 Python 代码的运行效率,让程序更加高效地执行。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容