python实现堆栈与队列的方法python实现堆栈与队列的方法
本文实例讲述了python实现堆栈与队列的方法 。分享给大家供大家参考 。具体分析如下:
1、python实现堆栈,可先将Stack类写入文件stack.py,在其它程序文件中使用from stack import Stack , 然后就可以使用堆栈了 。
stack.py的程序:
代码如下:class Stack():
def __init__(self,size):
self.size=size;
self.stack=[];
self.top=-1;
def push(self,ele):#入栈之前检查栈是否已满
if self.isfull():
raise exception("out of range");
else:
self.stack.append(ele);
self.top=self.top+1;
def pop(self):# 出栈之前检查栈是否为空
if self.isempty():
raise exception("stack is empty");
else:
self.top=self.top-1;
return self.stack.pop();
def isfull(self):
return self.top+1==self.size;
def isempty(self):
return self.top==-1;
再写一个程序文件,stacktest.py,使用栈,内容如下:
代码如下:#!/usr/bin/python
from stack import Stack
s=Stack(20);
for i in range(3):
s.push(i);
s.pop()
print s.isempty();
2、python 实现队列:
复制代码代码如下:class Queue():
def __init__(self,size):
self.size=size;
self.front=-1;
self.rear=-1;
self.queue=[];
def enqueue(self,ele):#入队操作
if self.isfull():
raise exception("queue is full");
else:
self.queue.append(ele);
self.rear=self.rear+1;
def dequeue(self):#出队操作
if self.isempty():
raise exception("queue is empty");
else:
self.front=self.front+1;
return self.queue[self.front];
def isfull(self):
return self.rear-self.front+1==self.size;
def isempty(self):
return self.front==self.rear;
q=Queue(10);
for i in range(3):
q.enqueue(i);
print q.dequeue();
print q.isempty();
希望本文所述对大家的Python程序设计有所帮助 。
Python实现简单多线程任务队列Python实现简单多线程任务队列
最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题 。梯度下降算法的代码如下(伪代码):
defgradient_descent():# the gradient descent codeplotly.write(X, Y)
一般来说,当网络请求 plot.ly 绘图时会阻塞等待返回 , 于是也会影响到其他的梯度下降函数的执行速度 。
一种解决办法是每调用一次 plotly.write 函数就开启一个新的线程,但是这种方法感觉不是很好 。我不想用一个像 cerely(一种分布式任务队列)一样大而全的任务队列框架,因为框架对于我的这点需求来说太重了,并且我的绘图也并不需要 redis 来持久化数据 。
那用什么办法解决呢?我在 python 中写了一个很小的任务队列,它可以在一个单独的线程中调用 plotly.write函数 。下面是程序代码 。
fromthreadingimportThreadimportQueueimporttime classTaskQueue(Queue.Queue):
首先我们继承 Queue.Queue 类 。从 Queue.Queue 类可以继承 get 和 put 方法,以及队列的行为 。
def__init__(self, num_workers=1):Queue.Queue.__init__(self)self.num_workers=num_workersself.start_workers()
初始化的时候,我们可以不用考虑工作线程的数量 。
defadd_task(self, task,*args,**kwargs):args=argsor()kwargs=kwargsor{}self.put((task, args, kwargs))
我们把 task, args, kwargs 以元组的形式存储在队列中 。*args 可以传递数量不等的参数,**kwargs 可以传递命名参数 。
defstart_workers(self):foriinrange(self.num_workers):t=Thread(target=self.worker)t.daemon=Truet.start()
我们为每个 worker 创建一个线程 , 然后在后台删除 。
下面是 worker 函数的代码:
推荐阅读
- 手游赛车竞速类游戏,赛车竞速类的游戏
- 新媒体如何提高能力,新媒体如何提高能力的方法
- 房产中介如何进行营销创新,适合房产中介的营销方案
- 九阳电磁炉直播卖货视频,九阳电磁炉京东商城自营
- php获取数据库配置文件 php的数据库配置在哪
- 系统u盘怎么变系统盘,如何把系统u盘变成普通u盘
- 桌面游戏广告卸载,桌面游戏广告卸载不了
- 7750cpu配什么,7750配什么主板
- 两个函数如何相加c语言 两个函数加在一起