博客
关于我
Python 优化提速的 8 个小技巧
阅读量:803 次
发布时间: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与Excel的完美邂逅:深入浅出,手把手教你轻松玩转Excel数据操作
查看>>
python与flask_Python编程中flask的简介与简单使用
查看>>
python与图灵机器人交互(WXPY版本)
查看>>
python与运算符_python运算符
查看>>
python两个列表获取交集,并集,差集
查看>>
python两个字典合并,两个list合并
查看>>
Python两个版本共存时,命令行升级pip
查看>>
Python两个版本共存时,怎么验证是否安装成功 scrapy
查看>>
Python两个版本共存时,通过pip安装Scrapy
查看>>
python两组变量的相关关系散点图_变量是什么?变量间的两种关系——函数关系和相关关系(小学版)...
查看>>
Python中 pass语句的作用
查看>>
python中 urllib, urllib2, httplib, httplib2 几个库的区别
查看>>
python中 yaml库 & json库 & xmltodict库使用
查看>>
python中 将你的名字转化成为二进制并输出
查看>>
Python中*args 和**kwargs的用法
查看>>
Python中*args 和**kwargs的用法
查看>>
Python中*args和**kwargs的使用
查看>>
python中0、1、True、False、if条件
查看>>
python中argparse模块关于 parse_args() 函数详解(全)
查看>>
python中base64编码与解码
查看>>