文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

高性能Python之:Queue,deq

2023-01-31 02:46

关注

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'])

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯