Python的秘密基地--[章节11] Python 性能优化与多线程编程
第11章:Python 性能优化与多线程编程
在开发复杂系统时,性能优化和并发编程是不可忽视的重点。Python 提供了多种工具和技术用于优化代码性能,并通过多线程、多进程等方式实现并发处理。本章将探讨如何在 Python 中提升性能,并实现多线程和多进程编程。
11.1 Python 性能优化
11.1.1 使用内置函数与库
Python 的内置函数和标准库通常经过高度优化,能够显著提高性能。
示例:使用内置函数代替循环
# 使用 sum 内置函数
numbers = [1, 2, 3, 4, 5]
result = sum(numbers) # 比手动循环累加更快
优选库:NumPy
对于需要处理大量数值计算的场景,使用 NumPy 代替纯 Python 代码会有显著性能提升。
import numpy as nparray = np.array([1, 2, 3, 4, 5])
print(np.sum(array)) # 更高效的数组运算
11.1.2 使用缓存技术
Python 的 functools.lru_cache 提供了一种简单的缓存机制,用于存储函数调用的结果,从而避免重复计算。
示例:递归斐波那契加速
from functools import lru_cache@lru_cache(maxsize=None)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(50)) # 快速计算
11.1.3 优化数据结构选择
根据使用场景选择合适的数据结构,例如:
- 列表(list):适合动态大小的数组操作。
- 集合(set):适合快速去重和查找。
- 字典(dict):适合键值对存储和快速查找。
示例:利用集合去重
# 去除重复元素
data = [1, 2, 2, 3, 4, 4]
unique_data = set(data)
11.1.4 使用并行化与向量化
对于 CPU 密集型任务,可以使用 多线程、多进程 或 向量化计算 来提高性能。
示例:并行化处理大规模数据
from multiprocessing import Pooldef square(n):return n ** 2with Pool(4) as pool:results = pool.map(square, range(1000000))
11.2 Python 并发编程
11.2.1 线程与线程池
Python 的 threading 模块支持多线程编程,但由于 GIL(全局解释器锁) 的限制,多线程更适合 I/O 密集型任务。
示例:使用 threading 模块
import threadingdef print_numbers():for i in range(5):print(i)# 创建线程
thread = threading.Thread(target=print_numbers)
thread.start()
thread.join()
线程池
对于大量线程管理,使用 concurrent.futures 模块中的线程池更加高效。
from concurrent.futures import ThreadPoolExecutordef square(n):return n ** 2with ThreadPoolExecutor(max_workers=4) as executor:results = list(executor.map(square, range(10)))
print(results)
11.2.2 多进程编程
Python 的 multiprocessing 模块绕过了 GIL,更适合 CPU 密集型任务。
示例:使用多进程
from multiprocessing import Processdef print_numbers():for i in range(5):print(i)process = Process(target=print_numbers)
process.start()
process.join()
进程池
与线程池类似,multiprocessing.Pool 提供了简洁的多进程管理。
from multiprocessing import Pooldef square(n):return n ** 2with Pool(4) as pool:results = pool.map(square, range(10))
print(results)
11.2.3 协程与异步编程
Python 的 asyncio 模块支持协程,用于处理高效的异步 I/O。
示例:基本异步任务
import asyncioasync def hello():print("Hello")await asyncio.sleep(1)print("World")asyncio.run(hello())
多个异步任务并发执行
async def task(name, delay):await asyncio.sleep(delay)print(f"Task {name} completed")async def main():tasks = [task("A", 2), task("B", 1)]await asyncio.gather(*tasks)asyncio.run(main())
11.3 性能分析工具
11.3.1 使用 cProfile
cProfile 是 Python 内置的性能分析工具,用于查找代码中的性能瓶颈。
示例:分析代码性能
import cProfiledef slow_function():total = 0for i in range(100000):total += ireturn totalcProfile.run('slow_function()')
11.3.2 使用 line_profiler
line_profiler 是一个第三方工具,用于逐行分析函数性能。
安装
pip install line_profiler
示例
在函数顶部添加装饰器 @profile,然后运行 kernprof 工具进行分析:
@profile
def slow_function():total = 0for i in range(100000):total += ireturn total
运行命令:
kernprof -l -v script.py
11.4 小结
本章介绍了:
- 性能优化:使用内置函数、缓存技术、优化数据结构和并行计算提升程序性能。
- 并发编程:利用多线程、多进程和协程实现高效并发。
- 性能分析工具:使用
cProfile和line_profiler分析代码性能。
下一章我们将进入 Python 网络编程的世界! 🌐📡
相关文章:
Python的秘密基地--[章节11] Python 性能优化与多线程编程
第11章:Python 性能优化与多线程编程 在开发复杂系统时,性能优化和并发编程是不可忽视的重点。Python 提供了多种工具和技术用于优化代码性能,并通过多线程、多进程等方式实现并发处理。本章将探讨如何在 Python 中提升性能,并实…...
drawDB docker部属
docker pull xinsodev/drawdb docker run --name some-drawdb -p 3000:80 -d xinsodev/drawdb浏览器访问:http://192.168.31.135:3000/...
探索图像编辑的无限可能——Adobe Photoshop全解析
文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里,视觉内容无处不在,而创建和编辑这些内容的能力已经成为许多行业的核心技能…...
【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象
文章目录 Section 7:Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…...
Spring Boot教程之五十五:Spring Boot Kafka 消费者示例
Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架,使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序,您可…...
统计有序矩阵中的负数
统计有序矩阵中的负数 描述 给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目 示例 1: 输入:grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]…...
【6】Word:海名公司文秘❗
目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换:粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列,单机右键…...
c语言 --- 字符串
创建字符串 1. 使用字符数组创建字符串 #include <stdio.h>int main() {char str[20] "Hello, world!";str[0] h; // 修改字符串的第一个字符printf("%s\n", str); // 输出:hello, world!return 0; }解释: 数组大小 20 表…...
LeetCode 热题 100_二叉树的最近公共祖先(49_236_中等_C++)(二叉树;深度优先搜索)
LeetCode 热题 100_二叉树的最近公共祖先(49_236) 题目描述:输入输出样例:题解:解题思路:思路一(深度优先搜索): 代码实现代码实现(思路一(深度优…...
(三)c#中const、static、readonly的区别
在 C# 中,const、static 和 readonly 都是用来定义不可变的值,但它们有一些关键的区别。让我们详细比较一下这三者的用途和特点: 1. const(常量) 编译时常量:const 用于声明常量,其值必须在编…...
人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用
大家好,我是微学AI,今天给大家介绍一下人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用。近日,演员王星因接到一份看似来自知名公司的拍戏邀约,被骗至泰国并最终被带到缅甸。这一事件迅速引发了社会的广泛关注。该…...
【C++】函数(下)
1、函数的常见样式 常见的函数样式有四种: (1)无参数无返回值 (2)有参数无返回值 (3)无参数有返回值 (4)有参数有返回值 (1)无参数无返回值 示例…...
一个使用 Golang 编写的新一代网络爬虫框架,支持JS动态内容爬取
大家好,今天给大家分享一个由ProjectDiscovery组织开发的开源“下一代爬虫框架”Katana,旨在提供高效、灵活且功能丰富的网络爬取体验,适用于各种自动化管道和数据收集任务。 项目介绍 Katana 是 ProjectDiscovery 精心打造的命令行界面&…...
深入探讨 Vue.js 的动态组件渲染与性能优化
Vue.js 作为一款前端领域中备受欢迎的渐进式框架,以其简单优雅的 API 和灵活性受到开发者的喜爱。在开发复杂应用时,动态组件渲染是一项极其重要的技术,它能够在页面中动态地加载或切换组件,从而显著提升应用的灵活性与用户体验。…...
vulnhub靶场【IA系列】之Tornado
前言 靶机:IA-Tornado,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 本文所用靶场、kali镜像以及相关工具,我放置在网盘中,可以复制后面链接查看 htt…...
简要认识JAVAWeb技术三剑客:HTMLCSSJavaScript
目录 一、web标准二、什么是HTML三、什么是CSS四、什么是JavaScript 黑马JAVAWeb飞书在线讲义地址: https://heuqqdmbyk.feishu.cn/wiki/LYVswfK4eigRIhkW0pvcqgH9nWd 一、web标准 Web标准也称网页标准,由一系列的标准组成,大部分由W3C&…...
C# 修改项目类型 应用程序程序改类库
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
卡通风格渲染
1、卡通风格渲染是什么 卡通风格渲染(Cartoon Shading),也称为非真实感渲染(NPR)或卡通渲染(Toon Shading) 主要目的是使3D模型看起来更像手绘的二维卡通或漫画风格,而不是逼真写实…...
ubuntu各分区的用途
在 Ubuntu 中,分区是将硬盘划分为多个逻辑部分的过程,每个分区可以用于不同的用途。合理分区可以提高系统性能、数据安全性和管理效率。以下是 Ubuntu 中常见分区及其用途的详细说明: 1. 根分区 (/) 用途:存放操作系统核心文件、…...
理解STC15F2K60S2单片机的最小电路
一、STC15F2K60S2与51单片机的区别 STC15F2K60S2和51单片机虽然都基于8051内核,但在多个方面存在显著区别: 1. CPU性能: - STC15F2K60S2:采用增强型8051 CPU,1T单时钟/机器周期,速度比普通8051快8-12倍…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
Easy Excel
Easy Excel 一、依赖引入二、基本使用1. 定义实体类(导入/导出共用)2. 写 Excel3. 读 Excel 三、常用注解说明(完整列表)四、进阶:自定义转换器(Converter) 其它自定义转换器没生效 Easy Excel在…...
Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
以太网PHY布局布线指南
1. 简介 对于以太网布局布线遵循以下准则很重要,因为这将有助于减少信号发射,最大程度地减少噪声,确保器件作用,最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确,然…...
