㈠ python堆内存和栈内存的区别
栈和堆不是Java特有的概念,几乎所有的可执行程序,不论操作系统,都会有这两个内存区域的定义。在网上随机搜了几篇文章,看了之后应该能够解决你的困惑。
㈡ 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实现,将一堆数据平分用什么方法,列表还是队列哪个好具体代码怎么写,非常感
>>>buffer
[0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]
>>>a=buffer[0::2]
>>>b=buffer[1::2]
>>>a,b
([0,2,4,6,8,0,2,4,6,8],[1,3,5,7,9,1,3,5,7,9])
>>>
列表是常用的数据结构, 队列常用于多任务处理的通信
㈣ python堆和栈的区别有哪些
堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:
(1)程序内存布局场景下,堆与栈表示的是两种内存管理方式;
(2)数据结构场景下,堆与栈表示两种常用的数据结构。
相关推荐:《Python教程》
堆与栈实际上是操作系统对进程占用的内存空间的两种管理方式,主要有如下几种区别:
(1)管理方式不同。栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏;
(2)空间大小不同。每个进程拥有的栈的大小要远远小于堆的大小。理论上,程序员可申请的堆大小为虚拟内存的大小,进程栈的大小 64bits 的 Windows 默认 1MB,64bits 的 Linux 默认 10MB;
(3)生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
(4)分配方式不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由操作系统进行释放,无需我们手工实现。
(5)分配效率不同。栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多。
(6)存放内容不同。栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候,要对当前函数执行断点进行保存,需要使用栈来实现,首先入栈的是主函数下一条语句的地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容(EBP),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是被调函数的局部变量,注意静态变量是存放在数据段或者BSS段,是不入栈的。出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址,主程序又从该地址开始执行。堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的。
从以上可以看到,堆和栈相比,由于大量malloc()/free()或new/delete的使用,容易造成大量的内存碎片,并且可能引发用户态和核心态的切换,效率较低。栈相比于堆,在程序中应用较为广泛,最常见的是函数的调用过程由栈来实现,函数返回地址、EBP、实参和局部变量都采用栈的方式存放。虽然栈有众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,主要还是用堆。
无论是堆还是栈,在内存使用时都要防止非法越界,越界导致的非法内存访问可能会摧毁程序的堆、栈数据,轻则导致程序运行处于不确定状态,获取不到预期结果,重则导致程序异常崩溃,这些都是我们编程时与内存打交道时应该注意的问题。
㈤ python 写堆排序有什么用
#include using namespace std; int a[101],n; void d(int i,int m) { while(i*2n; for(int i=1;i>a[i]; for(int i=n;i>=n/2;i--) d(i,n); for(int i=n;2;i--) {swap(a[i],a[1]);d(1,i-1);} for(int i=1;i
㈥ python怎么从一堆数据中取数
数据存放在MySQL里面,在数据库里面查询发现有个字段的数据是JSON格式,不方便进行后续的操作,比方说:统计分析,特征提取等。所以想把这个字段里面的JSON格式数据进行解析,解析成功后,然后把以结构化表的形式存放到MySQL数据库。
具体步骤:
通过Python3连接MySQL,
获取MySQL数据集,
利用Python的相应库解析JSON格式数据,
把解析好数据放到数据框,并回存到MySQL数据库。
㈦ python 堆排序报错
完全不知道你在干啥,看看我在你基础上改写的代码。 建议你搞清楚 python 基本语法,以及 heap sort 算法本身。
defbuildHeap(array,pos):
asize=len(array)
temp=array[pos]
idx=2*pos+1
ifidx>=asize:
returnarray
ifidx+1<asizeandarray[idx+1]<array[idx]:
idx+=1
ifarray[idx]<array[pos]:
array[idx],array[pos]=array[pos],array[idx]
returnbuildHeap(array,idx)
definitialHeap(array):
endpoint=len(array)//2-1
whileendpoint>=0:
array=buildHeap(array,endpoint)
endpoint-=1
returnarray;
defheapOrder(array):
ret=[]
asize=len(array)
whileasize>0:
asize-=1
array[0],array[asize]=array[asize],array[0]
ret.append(array[asize])
ifasize>0:
array=buildHeap(array[0:asize],0)
returnret
if__name__=='__main__':
array=initialHeap([45,76,12,34,98,67,43,68,44,77])
print(array)
result=heapOrder(array)
print('Result:',result)
㈧ python有没有堆和栈的概念
请不要使用Java那一套思想来理解python。
JVM和CLR的那种stack和heap的区分应该是没有的,按这个算python应该只有heap,但是有常量池。陈儒老师和赖勇浩老师的《Python源码剖析》有详细的介绍这方面的知识。
㈨ 为什么python没有大顶堆
python的heapq在实现的时候,没有像STL或者Java可以传入比较函数,具体的原因可以参考参考文档给出的链接。
因此有些人想出了比较trick的思路。一句话概括如下:
push(e)改为push(-e),pop(e)为-pop(e),也就是说存入和取出的数都是相反数,其他逻辑和TopK相同。
实现用户自定义的比较函数,允许elem是一个tuple,按照tuple的第一个元素进行比较,所以可以把tuple的第一个元素作为我们的比较的key。。