高性能Python之:Queue,deque,queue对比

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

Python作为一门脚本语言,有着很多便捷易用的优秀特点,但他也有一个很大的缺陷,就是性能太差,这也是作为脚本语言不可避免的问题,这里我们来学习一些方法,提高Python的性能:

为了大家测试方便,这里同时给了代码的图片版和文字版。

  • queue是多线程中的使用的栈,但是Python 解释器有一个全局解释器锁(PIL),导致每个 Python 进程中最多同时运行一个线程,因此 Python 多线程程序并不能改善程序性能,不能发挥多核系统的优势。

  • multiprocessing.Queue是Python 2.6 引入的用来实现多进程的一种高性能栈。

  • collections.deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。

Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。

multiprocessing.Queue

用于多进程:

先来看官方文档:

高性能Python之:Queue,deque,queue对比

from multiprocessing import Pool

deff(x):

returnx*x

if__name__=='__main__':

withPool(5)asp:

print(p.map(f,[1,2,3]))

输出:

[1,4,9]

multiprocessing supports two types of communication channel between processes:

multiprocessing支持两种类型的进程间通信方式queues和pips。


Queues

The Queue class is a near clone of queue.Queue. For example:

Queue是queue.Queue的近似克隆。高性能Python之:Queue,deque,queue对比

from multiprocessing import Process,Queue

deff(q):

q.put([42,None,'hello'])

if__name__=='__main__':

q=Queue()

p=Process(target=f,args=(q,))

p.start()

print(q.get())# prints "[42, None, 'hello']"

p.join()

Queues are thread and process safe.

Queues是进程和线程安全的,也就是说,同一时间,只能由一个进程或者线程操作Queues。


queue

先来看官方文档:

高性能Python之:Queue,deque,queue对比

def worker():

whileTrue:

item=q.get()

ifitem is None:

break

do_work(item)

q.task_done()

q=queue.Queue()

threads=[]

foriinrange(num_worker_threads):

t=threading.Thread(target=worker)

t.start()

threads.append(t)

foritem insource():

q.put(item)

# block until all tasks are done

q.join()

# stop workers

foriinrange(num_worker_threads):

q.put(None)

fortinthreads:

t.join()


collections.deque

先来看官方文档:

有人对比过以上三者的性能,deque作为一种双向队列性能完胜其他两者。高性能Python之:Queue,deque,queue对比

>>>from collections import deque

>>>d=deque('ghi')# make a new deque with three items

>>>forelem ind:# iterate over the deque's elements

...print(elem.upper())

G

H

I

>>>d.append('j')# add a new entry to the right side

>>>d.appendleft('f')# add a new entry to the left side

>>>d# show the representation of the deque

deque(['f','g','h','i','j'])

>>>d.pop()# return and remove the rightmost item

'j'

>>>d.popleft()# return and remove the leftmost item

'f'

>>>list(d)# list the contents of the deque

['g','h','i']

>>>d[0]# peek at leftmost item

'g'

>>>d[-1]# peek at rightmost item

'i'

>>>list(reversed(d))# list the contents of a deque in reverse

['i','h','g']

>>>'h'ind# search the deque

True

>>>d.extend('jkl')# add multiple elements at once

>>>d

deque(['g','h','i','j','k','l'])

>>>d.rotate(1)# right rotation

>>>d

deque(['l','g','h','i','j','k'])

>>>d.rotate(-1)# left rotation

>>>d

deque(['g','h','i','j','k','l'])

>>>deque(reversed(d))# make a new deque in reverse order

deque(['l','k','j','i','h','g'])

>>>d.clear()# empty the deque

>>>d.pop()# cannot pop from an empty deque

Traceback(most recent call last):

File"<pyshell#6>",line1,in-toplevel-

d.pop()

IndexError:pop froman empty deque

>>>d.extendleft('abc')# extendleft() reverses the input order

>>>d

deque(['c','b','a'])

Python】 Collections Deque ,通常被称作“双端队列”(double-ended queue),是Python标准库中 模块提供的一个高性能数据结构。它不仅仅是普通队列的实现,其独特之处在于能够高效地在队列的两端(头部和尾部)进行元素的添加和删除操作。相较于Python内置的 类型, 在处理队列和栈这类需要频繁在两端操作的场景时,展现出卓越的性能优势。 在头部进行插入 () 或删除 () 时,由于需要移动后续所有元素,其时间复杂度为 (O(n)),这在处理大量数据时会导致显著的性能瓶颈。而 的设计目标正是为了解决这一痛点,使得在两 阅读详情

相关推荐

知识拓展:Python集合类型 defaultdict 和 deque 详解

提供了自动处理默认值的优雅方式deque提供了高效的双端队列操作两者的组合在 Scrapy 中实现了灵活且高效的中间件管理这种设计模式值得在类似场景中借鉴。

Minner 908

双端队列(Deque)

deque,即双端队列(double ended queue),是一种可以在两端扩展或收缩的序列化容器。deque是C++ 标准模板库的一部分,想要使用deque,需要在程序中包含头文件deque。规定了deque中可以存放哪种类型的元素。为deque名。

Hacket_Xu的博客 1万+

Python:【性能利器】 deque() 高效操作指南

本文深入探讨Pythondeque()的高效操作指南,对比其与list在性能上的显著差异,特别是在频繁的两端操作场景下。通过实际案例和性能测试,展示deque在队列实现、滑动窗口算法和LRU缓存等应用中的优势,帮助开发者提升代码效率。

weixin_27310417的博客 390

【C++】deque的实现原理简单介绍

【C++】deque的实现原理简单介绍

一点一点变好 4352

C++中的deque详解

本文详细介绍了C++中的deque容器,包括其基本特性、基本操作、内存管理以及应用场景。通过示例代码,读者可以更加深入地了解deque的使用方法和性能特点。在实际编程中,根据具体需求选择适合的容器类型是非常重要的。

Weirdo的博客 8053

【STL】deque容器详解(deque常用的操作函数、构造函数、赋值操作、大小操作、插入和删除、数据存取)

(1)功能:双端数组,可以对头端进行插入删除操作,也可以对尾端进行插入和删除操作。vector对于头部的插入效率低,数据量越大,效率越低,例如头部后有十万个数据,则往头部插入一个数据时,十万个数据都需要往后挪一挪才能在头部插入数据。deque相对而言,对头部的插入删除速度会比vector快。vector访问元素时的速度会比deque快,这和两者内部实现有关。

瞌睡的博客 7310

deque的简单介绍 & 优先级队列

deque和priority_queue

lmw3020083657的博客 2647

python collections.dequequeue.Queue的区别

python不同队列之间的区别

wanglei200708的专栏 557

PythondequeQueue对比与选型指南

Python编程中,数据结构的选择直接影响程序性能和线程安全。队列(Queue)作为基础数据结构,分为线程安全的queue.Queue和高效双端操作collections.deque两种实现。从底层原理看,deque采用双向链表结构,两端操作时间复杂度均为O(1),适合高频插入删除场景;而Queue通过锁机制实现线程安全,内置任务协调功能,是多线程编程的首选。实际开发中,单线程应用应优先使用deque提升性能,多线程环境则需根据是否要求原子操作和任务跟踪来选择。典型应用场景包括BFS算法实现(deque)

weixin_34163553的博客 286

deque(双端队列)与 queue.Queue 的区别、联系及使用场景

本文对比Python 中的 dequequeue.Queue 两种队列结构。deque 是高效的双端队列,支持 O(1) 时间复杂度的两端操作,适合单线程算法优化(如 BFS、滑动窗口),但需手动处理线程安全。queue.Queue线程安全的 FIFO 队列,内置锁和阻塞机制,适用于多线程任务调度(如生产者-消费者模型)。两者各有侧重:deque 以灵活性见长,queue.Queue线程安全为优势。选择时应根据单线程/多线程需求、操作方式和性能要求进行权衡。

学习代码 646

python deque vs Queue vs list

python使用deque实现高性能双端队列  11-02  python  rfyiamcool  2,227 views 今天有个哥们问我点东西,是分析数据的时候,会把感兴趣的数据存入到队列里面,同时有多个线程针对数据进行操作,有些数据会往前插入,他现在的问题是后时候堵塞在insert动作。 我推荐他用deque。今天宅了一天,写了个hadoop

screaming的博客 3924

Python deque:从基础操作到高级算法实战

本文深入探讨Python deque数据结构,从基础操作到高级算法实战。通过对比列表性能,展示deque在双端操作、滑动窗口算法、BFS等场景中的高效应用,帮助开发者优化代码性能。特别适合处理实时数据流和需要频繁两端操作的任务。

weixin_30859423的博客 1347

HoRain云--Python队列实现:3种高效方法详解

🎯 Python队列实现指南:3种方法对比 队列是遵循FIFO原则的数据结构。本文对比三种Python实现方式: 1️⃣ 列表(list)实现 - 适合初学者但pop(0)性能差 2️⃣ collections.deque - 单线程首选,两端操作O(1)复杂度 3️⃣ queue.Queue - 线程安全,适合多线程环境 📌 实践建议: 优先选择deque实现 避免列表的pop(0)性能陷阱 多线程场景使用queue.Queue 注意空队列异常处理 队列适用于任务调度、BFS算法等场景。根据需求选择合

sinat_57153473的博客 1625

《Effective Python》第十二章 数据结构与算法——用 Pythondeque 实现高性能生产者-消费者队列

《Effective Python》推荐优先使用collections.deque而非list实现生产者-消费者队列。list.pop(0)操作时间复杂度为O(n),而deque.popleft()为O(1),性能更优。通过邮件归档系统案例对比,验证了deque在队列操作中的高效性,特别适合高吞吐量场景。在实际开发中应根据需求选择合适的数据结构,deque高性能FIFO队列的优选方案。

企业级后端与 AI 应用开发双线探索 816

Python队列模块全解析:从线程间通信到高效双端队列

Python通过不同的队列实现,为开发者提供了灵活的选择空间。理解各队列类型的设计哲学和实现原理,能够帮助我们在实际开发中做出最优选择。无论是处理高并发请求、实现高效算法,还是构建分布式系统,正确使用队列都将显著提升程序的健壮性和执行效率。

m0_73581472的博客 541

你的 deque 为什么总“丢”数据?——Python collections.deque 的 maxlen 自动丢弃陷阱全揭秘

Python的collections.deque在设置maxlen参数时会自动丢弃另一端元素,这一特性可能导致数据丢失风险。本文揭示了deque的三种典型问题场景:滑动窗口日志丢失、生产者-消费者模型数据覆盖以及extend操作的隐蔽丢弃行为。通过分析底层双向链表实现原理,对比deque与其他队列结构的差异,指出其自动丢弃机制可能引发的五大陷阱,包括误用为可靠队列、顺序混淆等问题。最后提出五种解决方案:手动检查丢弃、使用阻塞队列、自定义非丢弃deque、手动控制队列大小以及明确滑动窗口用途,并建议通过日志

深山技术宅的博客 331

Grumpy中的队列实现:Go通道与Python Queue模块

在并发编程中,队列(Queue)是实现线程间安全通信的核心组件。Grumpy作为Python到Go的转译器,通过独特的技术路径将Python的队列机制映射到底层的Go语言通道(Channel),实现了高效的跨语言并发控制。本文将深入解析Grumpy中两种队列实现的技术细节,帮助开发者理解Python Queue模块如何在Go运行时中高效工作。 ## Python Queue模块的经典实现 Gr...

gitblog_00933的博客 805

Python - 实现Stacks 和Queues

python没有像C++那样的struct 来实现栈 和队列,但是可以用deque来实现栈和队列,当然,栈也可以用最简单的list来实现。实现 Stacks 用lists实现Stacks   The list methods make it very easy to use a list as a stack, where the last element added is the first e

Jark's Trick 1000
上一篇: Python 多线程与常见算法
下一篇: Python多线程编程
静妍
博客等级 码龄14年 275粉丝 44原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值