博客
关于我
Python 优化提速的 8 个小技巧
阅读量:797 次
发布时间: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 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
查看>>
python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
查看>>
python 利用pyttsx3文字转语音
查看>>
python 利用已有Ner模型进行数据清洗合并
查看>>
python 到大数据开发工程师_如何成为一个大数据开发工程师?
查看>>
python 加密解密(base64, AES)
查看>>
Python 包管理器和 Node.js
查看>>
python 启动提示IDLE's subprocess didn't make conne...
查看>>
Python 和 OpenCV.如何检测图像中的所有(填充)圆形/圆形对象?
查看>>
Python 和 RabbitMQ - 聆听来自多个渠道的消费事件的最佳方式?
查看>>
python编辑器打不开_关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路...
查看>>
python编译exe同时支持32位_第三周:同时管理64位和32位版本的Python,并用Pyinstaller打包成exe...
查看>>
Python 和Java 哪个更适合做自动化测试?
查看>>
Python编程:掌握高级语言程序设计。从零基础到精通,收藏这篇就够了!
查看>>
python 图片转ico
查看>>
python 图片转文字、语音转文字、文字转语音保存音频并朗读
查看>>
python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
查看>>
Python 在并行进程之间共享字典
查看>>
Python 垃圾收集器文档
查看>>
python 基于 wordcloud + jieba + matplotlib 生成词云
查看>>