本文共 4187 字,大约阅读时间需要 13 分钟。
作为一名开发人员,你可能已经发现 Python 的性能在某些场景下略显不足。虽然它比 C/C++ 等静态类型语言更灵活,但在需要高效处理大量数据或复杂逻辑时,优化代码至关重要。本文将分享一些实用的 Python 代码优化技巧,帮助你更好地提升代码性能。
在 Python 中,全局变量的访问速度较慢,因为它们需要查找全局命名空间,这会带来额外的开销。将代码放入函数中可以显著提升性能。
import mathsize = 10000for x in range(size): for y in range(size): z = math.sqrt(x) + math.sqrt(y)
import mathdef main(): size = 10000 for x in range(size): for y in range(size): z = math.sqrt(x) + math.sqrt(y) return zif __name__ == "__main__": main()
通过将代码移动到函数中,可以减少全局变量的查找,提升运行速度。
属性访问(如 obj attribute)会触发内置的方法(如 __getattribute__() ),这些方法的开销较高。将频繁访问的属性转换为局部变量,可以显著减少性能损耗。
import mathfrom typing import Listclass DemoClass: def __init__(self, value: int): self._value = value def computeSqrt(self, size: int) -> List[float]: result = [] append = result.append sqrt = math.sqrt for _ in range(size): append(math.sqrt(self._value)) return resultdef main(): size = 10000 demo_instance = DemoClass(size) result = demo_instance.computeSqrt(size)
import mathfrom typing import Listclass DemoClass: def __init__(self, value: int): self.value = value def computeSqrt(self, size: int) -> List[float]: result = [] append = result.append value = self.value # 将属性访问转换为局部变量 for _ in range(size): append(math.sqrt(value)) return resultdef main(): size = 10000 demo_instance = DemoClass(size) result = demo_instance.computeSqrt(size)
过度使用属性访问器(如装饰器或 setter)会增加代码的复杂性,进而影响性能。只有在必要时才使用属性访问器,否则直接使用简单属性会更高效。
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
Python 的内存管理机制会导致不必要的数据复制,尤其是在处理字符串拼接时。使用 join() 而不是 + 进行字符串拼接,可以避免内存分配和复制带来的性能损耗。
import stringfrom typing import Listdef concatString(string_list: List[str]) -> str: result = '' for str_i in string_list: result += str_i return resultdef main(): string_list = list(string.ascii_letters * 100) for _ in range(10000): result = concatString(string_list)
import stringfrom typing import Listdef concatString(string_list: List[str]) -> str: return ''.join(string_list)def main(): string_list = list(string.ascii_letters * 100) for _ in range(10000): result = concatString(string_list)
if 条件的短路特性if 条件的短路特性可以帮助减少不必要的操作。将条件尽可能地放在 or 前(因为 or 的短路效率更高),可以提升性能。
from typing import Listdef 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 Listdef 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: result += str_i return result Python 的 for 循环比 while 循环更高效。避免使用显式的 for 循环,尽量使用内置函数或 list 的方法来替代。
def computeSum(size: int) -> int: sum_ = 0 i = 0 while i < size: sum_ += i i += 1 return sum_def main(): size = 10000 for _ in range(size): sum_ = computeSum(size)
def computeSum(size: int) -> int: return sum(range(size))def main(): size = 10000 for _ in range(size): sum_ = computeSum(size)
numba.jitnumba 是一个非常强大的 Python 扩展,它可以将 Python 函数 JIT 编译为机器码,显著提升运行速度。
import numba@numba.jitdef computeSum(size: float) -> float: sum_ = 0.0 for i in range(size): sum_ += i return sum_def main(): size = 10000 for _ in range(size): sum_ = computeSum(size)
Python 内置的数据结构(如 list、tuple、dict 等)是 C 实现的,性能非常高。如果需要频繁进行增删改查操作,尽量使用 deque 而不是 list,因为 deque 在双端操作方面效率更高。
通过以上优化技巧,你可以显著提升 Python 代码的运行速度。记住,优化代码的前提是代码必须正确运行,因此在优化之前,始终要确保代码的正确性。
转载地址:http://cdofk.baihongyu.com/