博客
关于我
Python 优化提速的 8 个小技巧
阅读量:795 次
发布时间: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 内置的数据结构(如 listtupledict 等)是 C 实现的,性能非常高。如果需要频繁进行增删改查操作,尽量使用 deque 而不是 list,因为 deque 在双端操作方面效率更高。


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

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

你可能感兴趣的文章
python datetime
查看>>
python datetime笔记
查看>>
python day01
查看>>
python day10
查看>>
Python Day17 Django 03
查看>>
python day21
查看>>
python decode和encode
查看>>
Python del 语句
查看>>
Python Dict 理解创建和更新字典
查看>>
Python Discord Bot - python clear_reaction() 清除所有反应而不是特定反应
查看>>
python django mysql写入中文乱码_django自动创建的mysql表里面中文乱码问题
查看>>
python docx的超链接网址和链接文本
查看>>
python elasticsearch 导出数据到json文件导入到另一个es中
查看>>
python ETL工具 pyetl
查看>>
Python eval 函数说明
查看>>
python eval简介
查看>>
python excel 饼图 简书_Python实现绘画多个饼图
查看>>
python excel接口自动化测试框架!
查看>>
Python exec 函数解析:探索动态代码执行的无限可能!
查看>>
Python EXEC和__NAME__
查看>>