博客
关于我
Python 优化提速的 8 个小技巧
阅读量:805 次
发布时间:2023-03-06

本文共 4187 字,大约阅读时间需要 13 分钟。

Python 代码优化技巧:如何提升运行速度

作为一名开发人员,你可能已经发现 Python 的性能在某些场景下略显不足。虽然它比 C/C++ 等静态类型语言更灵活,但在需要高效处理大量数据或复杂逻辑时,优化代码至关重要。本文将分享一些实用的 Python 代码优化技巧,帮助你更好地提升代码性能。


1. 避免全局变量

在 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()

通过将代码移动到函数中,可以减少全局变量的查找,提升运行速度。


2. 避免不必要的属性访问

属性访问(如 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)

3. 避免不必要的抽象

过度使用属性访问器(如装饰器或 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

4. 避免不必要的数据复制

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)

5. 利用 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

6. 循环优化

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)

7. 使用 numba.jit

numba 是一个非常强大的 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)

8. 选择合适的数据结构

Python 内置的数据结构(如 list、tuple、dict 等)是 C 实现的,性能非常高。如果需要频繁进行增删改查操作,尽量使用 deque 而不是 list,因为 deque 在双端操作方面效率更高。


通过以上优化技巧,你可以显著提升 Python 代码的运行速度。记住,优化代码的前提是代码必须正确运行,因此在优化之前,始终要确保代码的正确性。

转载地址:http://cdofk.baihongyu.com/

你可能感兴趣的文章
python判断字符串包含中文_Python 判断字符串是否包含中文
查看>>
python删除第一行_Python 乱码指北:一行删掉根目录
查看>>
Python删除列表元素的三种方法
查看>>
python初步学习-python数据类型-集合(set)
查看>>
python列表生成字典_Python中将字典转换为列表的方法
查看>>
python列表对应元素合并为列表及判断一个列表是几维
查看>>
python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校体育赛事系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校危化品管理系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校校园线上跳蚤市场的系统设计(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校疫情防控管理平台(程序+开题+论文)
查看>>
Python+Jenkins+Allure Report接口自动化测试持续集成
查看>>
python+locust电商全流程性能测试
查看>>
Python函数运行的可执行文件的终端输出如何以一般方式静音?
查看>>
Python+Pytest+Allure+Git+Jenkins接口自动化框架
查看>>
python+pytest接口自动化 —— 参数关联
查看>>
python+pytest接口自动化 —— 参数关联
查看>>
Python+pytest接口自动化 —— 接口测试基础
查看>>
python+pytest接口自动化 —— 自动化用例编写思路 (使用pytest编写一个测试脚本)
查看>>