Python 高性能编程技巧:提升代码效率的实战指南

news/2025/3/30 16:59:56/文章来源:https://www.cnblogs.com/yoyoliwu/p/18795672

在 Python 编程中,性能优化是一个至关重要的环节,尤其是在处理大规模数据或高并发任务时。虽然 Python 以简洁易读著称,但默认情况下它可能不是性能最高的语言。幸运的是,通过一些技巧和方法,我们可以显著提升 Python 程序的性能。今天,我们将分享一些实用的 Python 高性能编程技巧,帮助你编写更高效的代码。

一、优化算法与数据结构

(一)选择合适的算法

算法的效率对程序性能有着直接的影响。在编写代码时,应尽量选择时间复杂度较低的算法。例如,对于排序问题,优先选择快速排序或归并排序,而不是冒泡排序。

(二)使用合适的数据结构

Python 提供了多种内置数据结构,如列表、字典、集合等。了解这些数据结构的性能特点,可以帮助你更好地选择合适的工具。例如,字典和集合的查找操作平均时间复杂度为 O(1),而列表为 O(n)。

# 使用字典进行快速查找
data = {i: i * 2 for i in range(1000000)}
print(data[999999])  # O(1)# 使用列表进行查找
data = [i * 2 for i in range(1000000)]
print(data.index(1999998))  # O(n)

二、利用内置函数和库

(一)使用内置函数

Python 的内置函数通常经过高度优化,执行效率比自定义函数更高。例如,使用 sum()min()max() 等内置函数,而不是手动编写循环来计算。

# 使用内置函数
numbers = [1, 2, 3, 4, 5]
total = sum(numbers)  # 内置函数
print(total)# 手动编写循环
total = 0
for num in numbers:total += num
print(total)

(二)使用标准库

Python 的标准库提供了许多高效的工具和模块。例如,collections 模块中的 Counterdefaultdictdeque,以及 itertools 模块中的函数,都可以帮助你更高效地处理数据。

from collections import Counter# 使用 Counter 统计元素出现次数
data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
counter = Counter(data)
print(counter)  # Counter({4: 4, 3: 3, 2: 2, 1: 1})

三、多线程与多进程

(一)多线程

Python 的多线程适用于 I/O 密集型任务,如文件读写、网络请求等。通过 threading 模块,可以轻松实现多线程。

import threadingdef task(name):print(f"线程 {name} 开始执行")# 模拟耗时操作time.sleep(2)print(f"线程 {name} 结束")# 创建线程
thread1 = threading.Thread(target=task, args=("A",))
thread2 = threading.Thread(target=task, args=("B",))# 启动线程
thread1.start()
thread2.start()# 等待所有线程完成
thread1.join()
thread2.join()

(二)多进程

对于 CPU 密集型任务,多进程可以更好地利用多核 CPU 的性能。通过 multiprocessing 模块,可以创建多个进程。

from multiprocessing import Processdef task(name):print(f"进程 {name} 开始执行")# 模拟耗时操作time.sleep(2)print(f"进程 {name} 结束")# 创建进程
process1 = Process(target=task, args=("A",))
process2 = Process(target=task, args=("B",))# 启动进程
process1.start()
process2.start()# 等待所有进程完成
process1.join()
process2.join()

四、其他优化技巧

(一)减少全局变量的使用

全局变量的访问速度比局部变量慢,因此在函数中尽量使用局部变量,以提高代码的执行效率。

# 不推荐:使用全局变量
x = 10
def increment():global xx += 1# 推荐:使用局部变量
def increment():x = 10x += 1return x

(二)使用生成器

生成器可以逐个产生值,而不是一次性生成所有值,从而节省内存。

# 不推荐:使用列表生成式
numbers = [i for i in range(1000000)]# 推荐:使用生成器表达式
numbers = (i for i in range(1000000))

(三)避免不必要的数据复制

在处理大型数据结构时,避免不必要的数据复制可以显著提高性能。

# 不推荐:复制数据
data_copy = data[:]# 推荐:直接操作原始数据
data = [1, 2, 3, 4, 5]
data.append(6)

五、实战案例:优化一个简单的数据处理程序

假设我们有一个程序,需要处理一个包含大量数据的列表,并计算每个元素的平方。我们将通过优化算法、使用多线程和多进程来提高程序的性能。

(一)原始版本

import timedef square_numbers(numbers):return [x ** 2 for x in numbers]# 测试数据
numbers = list(range(1000000))# 计时开始
start_time = time.time()# 计算平方
result = square_numbers(numbers)# 计时结束
end_time = time.time()
print(f"耗时:{end_time - start_time:.2f} 秒")

(二)优化版本:使用多线程

import threading
import timedef square_numbers(numbers, result, index):for i, num in enumerate(numbers):result[index + i] = num ** 2# 测试数据
numbers = list(range(1000000))
result = [None] * len(numbers)# 划分任务
thread_count = 4
threads = []
chunk_size = len(numbers) // thread_countfor i in range(thread_count):start = i * chunk_sizeend = start + chunk_size if i != thread_count - 1 else len(numbers)thread = threading.Thread(target=square_numbers, args=(numbers[start:end], result, start))threads.append(thread)thread.start()# 等待所有线程完成
for thread in threads:thread.join()# 计时结束
end_time = time.time()
print(f"耗时:{end_time - start_time:.2f} 秒")

(三)优化版本:使用多进程

from multiprocessing import Process, Array
import timedef square_numbers(numbers, result, index):for i, num in enumerate(numbers):result[index + i] = num ** 2# 测试数据
numbers = list(range(1000000))
result = Array('i', len(numbers))# 划分任务
process_count = 4
processes = []
chunk_size = len(numbers) // process_countfor i in range(process_count):start = i * chunk_sizeend = start + chunk_size if i != process_count - 1 else len(numbers)process = Process(target=square_numbers, args=(numbers[start:end], result, start))processes.append(process)process.start()# 等待所有进程完成
for process in processes:process.join()# 计时结束
end_time = time.time()
print(f"耗时:{end_time - start_time:.2f} 秒")

六、总结

通过本文的介绍,你已经掌握了多种提高 Python 程序性能的技巧和方法。从优化算法和数据结构,到利用内置函数和库,再到多线程与多进程的应用,这些技巧可以帮助你编写出更高效、更强大的 Python 代码。

文章来源于zlibrary图书馆中《Python编程从入门到实践》书的Python 高性能编程技巧章节内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/906613.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出现Invalid bound statement (not found)错误

出现Invalid bound statement (not found)错误时,通常是由于MyBatis无法正确匹配Mapper接口与XML文件的映射关系。以下是具体排查步骤和解决方案:

当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系

《当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系》引言:一场OOM引发的血案 某个月黑风高的夜晚,监控系统突然发出刺耳的警报——我们的数据发现流水线集体扑街。事后复盘发现:Kafka集群、Gateway、Discovery服务默契地同时表演了OOM自杀式艺术行为。这场事…

EtherCAT转DeviceNet看台达MH2如何借助网关与欧姆龙CJ1W-DRM21通讯​

一.案例背景台达MH2设备通常采用EtherCAT通信协议,这种协议在高速实时通信方面表现出色,适合设备之间的快速数据交换和精准控制。而欧姆龙CJ1W-DRM21 模块基于DeviceNet通信协议,DeviceNet在工业现场总线领域应用广泛,侧重于设备的分布式控制和信息共享。EtherCAT与DeviceN…

温湿度传感器:核心原理与跨领域应用解析

一、温湿度传感器的技术演进与核心价值 温湿度传感器是一种通过物理或化学机制实时监测环境温湿度参数的电子设备。在物联网(IoT)与智慧化转型的浪潮中,其作为环境感知的 “神经末梢”,已渗透至工业制造、农业种植、医疗仓储等领域。根据市场研究机构的数据,2025 年全球温…

20242830 2021-2022-2 《网络攻防实践》第六周作业

20242830 2021-2022-2 《网络攻防实践》第六周作业 一、知识点梳理与总结本次实验旨在学会使用Metasploit软件对Windows系统进行远程渗透实验,能够让我们深入了解漏洞的原理和利用过程,如MS08-067这样的常见漏洞,通过实际操作去发现和利用它们,可以更加直观地理解系统存在的…

数字先锋 | 打造专属AI大脑,天翼云助力重庆理工大学开启智慧校园新篇!

从在线课程的蓬勃兴起,到远程教育的逐渐普及,再到智能教学工具的广泛应用……人工智能、大数据、云计算等前沿技术迅速发展的当下,科技正以前所未有的深度和广度重塑教育领域,促使教育各个层面发生深刻变革。师生对个性化、智能化教育服务的期待与日俱增,智慧校园建设,成…

【洛谷P6464】传送门

每天刷个一两题 比较值得写的会写在这里 P6464 [传智杯 #2 决赛] 传送门 题目描述 传智专修学院里有 \(n\) 栋教学楼,有 \(m\) 条双向通行道路连接这些教学楼,不存在重边和自环。每条道路都有一定的长度,而且所有教学楼之间都可以直接或者间接的通过道路到达。我们可以很容易…

高度混淆和多层嵌套的JSP案例免杀思路

免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造成不良后果,均由使用者本人负责,作者及本博客不承担任何责任。 01 分析特征 目前webshell检测方式还是以检测特征为主,像JSP木马中常见的Runtime、ProcessBuilder、rea…

某项目三台设备PCIE Surprise Down故障分析

描述: 某项目交付过程中,发现三台服务器报The PCIe Card 1 (PCIe Device) triggered an uncorrectable error的错误(如下图)分析 通过fdm/fdm_output日志,发现存在大量的PCIe的报错(如下),可以看出来全是Surprise Down Error错误,且问题都说发生在CPU1 的Riser模组上检…

关联(Association), 聚合(Aggregation), 组合(Composition) 在软件设计模式中的区别

关联(Association)、聚合(Aggregation)与组合(Composition)的区别 这三种关系都是面向对象设计中描述类之间关系的重要概念,它们在耦合强度、生命周期管理等方面有显著差异。 1. 关联(Association) 基本特征:最通用的关系类型,表示类之间的使用关系可以是单向或双向的关联对…

H7-TOOL固件2.28发布,CAN, UART和RTT三合一同时收发且实时记录,脱机烧录新增革命性一键添加新芯片功能,新增多脱机芯片支持

H7-TOOL详细介绍(含操作手册): http://www.armbbs.cn/forum.php?mod=viewthread&tid=89934H7-TOOL PLUS电池版无需升级,预装的已经是最新的2.28版。后面还有个PLUS电池板低功耗运行模式,后续也将上线。【PC软件】V2.2.8 1. 脱机烧录功能更新:- 新增MAGTRON(巨磁智能)…

gitlab+jenkins+harbor+k8s安装操作流程之java项目打包成docker镜像

介绍在Java项目打包成Docker镜像时,通常需要写Dockerfile。Dockerfile是用来构建Docker镜像的文本文件,它包括了构建Docker镜像所需的所有命令和步骤 首先Maven先构建jar包 注意:dockerfile各个参数的解释如下