我使用python实现循环队列,但却发现与数组队列时间差别不大

我使用python实现循环队列,但却发现与数组队列时间差别不大

# 具体遇到的问题
我使用python实现循环队列,但却发现与数组队列时间差别不大
# 报错信息的截图
python:

http://img1.sycdn.imooc.com//climg/5fdaf1c90907d94105680067.jpg

http://img1.sycdn.imooc.com//climg/5fdb13df0938fbfb05790073.jpg

java:

http://img1.sycdn.imooc.com//climg/5fdb12b209c3f1df01520098.jpg

# 尝试过的解决思路和结果

我完全是按照同样的思想实现的,可是两者差别却不像java那样明显
我想知道这是python语言特性的问题,还是我的实现方法有误?

import array as builtin_array


class LoopQueue:
def __init__(self, capacity: int = 20):
self._typeCode = 'h'
       self.__data = builtin_array.array(self._typeCode, (0, ) * (capacity + 1))
# print(self.__data)
       # print(len(self.__data))
       self.__front = 0
       self.__tail = 0

   def getCapacity(self) -> int:
return len(self.__data) - 1

   def isEmpty(self) -> bool:
return self.__front == self.__tail

def enqueue(self, e) -> None:
if (self.__tail + 1) % len(self.__data) == self.__front:
self.__resize(2 * self.getCapacity())
self.__data[self.__tail] = e
self.__tail = (self.__tail + 1) % len(self.__data)

def dequeue(self):
if self.isEmpty():
raise ValueError("不可从空队列中弹出元素!")
temp = self.__data[self.__front]
# 这步可要可不要
       # self.__data[self.__front] = 0
       self.__front = (self.__front + 1) % len(self.__data)
if self.getSize() <= self.getCapacity() / 4 and int(self.getCapacity() / 2):
self.__resize(int(self.getCapacity() / 2))
return temp

def getFront(self):
if self.isEmpty():
raise ValueError("不可从空队列中查看元素!")
return self.__data[self.__front]

def getSize(self) -> int:
if self.__tail >= self.__front:
return self.__tail - self.__front
else:
return len(self.__data) - self.__front + self.__tail

def __resize(self, newCapacity: int) -> None:
tempArray = builtin_array.array(self._typeCode, (0, ) * (newCapacity + 1))
i = 0
       for i in range(self.getSize()):
tempArray[i] = self.__data[(self.__front + i) % len(self.__data)]
self.__front = 0
       # 这里很重要,range不会为i加一,需要我们自己加
       self.__tail = i + 1
       self.__data = tempArray

def __str__(self):
string = "Queue: size=%d, capacity=%d, front[" % (self.getSize(), self.getCapacity())
i = self.__front
while not i == self.__tail:
string += str(self.__data[i])
if not (i + 1) % len(self.__data) == self.__tail:
string += ", "
           i = (i + 1) % len(self.__data)
string += "] tail"
       return string


if __name__ == '__main__':
loop_queue = LoopQueue(5)
# for i in range(100):
   #     loop_queue.enqueue(i)
   #     if i % 3 == 0:
   #         loop_queue.dequeue()
   #     print(loop_queue)

   for i in range(100):
loop_queue.enqueue(i)
for i in range(100):
loop_queue.dequeue()

import random

from ep2_SelectionSort.Clocker import clock
from ep5_Queue.ArrayQueue import ArrayQueue
from ep5_Queue.LoopQueue import LoopQueue


@clock
def timer(capacity, queueInstance):
for i in range(capacity):
queueInstance.enqueue(random.randint(0, 2**15 - 1))
for i in range(capacity):
queueInstance.dequeue()
return capacity


if __name__ == '__main__':
capacity = 1000000
   arrayQueue = ArrayQueue()
loopQueue = LoopQueue()
timer(capacity, arrayQueue)
timer(capacity, loopQueue)
import time


def clock(func):
def clocked(*args):
t0 = time.perf_counter()
result = func(*args)
elapsed = time.perf_counter() - t0
name = func.__name__
       print('Time elapsed: %0.8fs, sequence length=%d' % (elapsed, result))
return result
return clocked

在这里输入代码,可通过选择【代码语言】突出显示

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
提问者 Mr__Xin 2020-12-21 00:22:45

1
import array as builtin_array<br><br><br>class LoopQueue:<br>    def __init__(self, capacity: int = 20):<br>        # 全部数据类型均为有符号数<br>        if capacity <= 0:<br>            raise ValueError("容量不可为负或零!")<br>        elif capacity <= 2 ** 15 - 1:<br>            self._typeCode = 'h'<br>        elif capacity <= 2 ** 31 - 1:<br>            self._typeCode = 'l'<br>        elif capacity <= 2 ** 63 - 1:<br>            self._typeCode = 'q'<br>        self.__data = builtin_array.array(self._typeCode, (0, ) * (capacity + 1))<br>        # print(self.__data)<br>        # print(len(self.__data))<br>        self.__front = 0<br>        self.__tail = 0<br><br>    def getCapacity(self) -> int:<br>        return len(self.__data) - 1<br><br>    def isEmpty(self) -> bool:<br>        return self.__front == self.__tail<br><br>    def enqueue(self, e) -> None:<br>        if (self.__tail + 1) % len(self.__data) == self.__front:<br>            self.__resize(2 * self.getCapacity())<br>        self.__data[self.__tail] = e<br>        self.__tail = (self.__tail + 1) % len(self.__data)<br><br>    def dequeue(self):<br>        if self.isEmpty():<br>            raise ValueError("不可从空队列中弹出元素!")<br>        temp = self.__data[self.__front]<br>        # 这步可要可不要<br>        # self.__data[self.__front] = 0<br>        self.__front = (self.__front + 1) % len(self.__data)<br>        if self.getSize() <= self.getCapacity() / 4 and int(self.getCapacity() / 2):<br>            self.__resize(int(self.getCapacity() / 2))<br>        return temp<br><br>    def getFront(self):<br>        if self.isEmpty():<br>            raise ValueError("不可从空队列中查看元素!")<br>        return self.__data[self.__front]<br><br>    def getSize(self) -> int:<br>        if self.__tail >= self.__front:<br>            return self.__tail - self.__front<br>        else:<br>            return len(self.__data) - self.__front + self.__tail<br><br>    def __resize(self, newCapacity: int) -> None:<br>        tempArray = builtin_array.array(self._typeCode, (0, ) * (newCapacity + 1))<br>        i = 0<br>        for i in range(self.getSize()):<br>            tempArray[i] = self.__data[(self.__front + i) % len(self.__data)]<br>        self.__front = 0<br>        # 这里很重要,range不会为i加一,需要我们自己加<br>        self.__tail = i + 1<br>        self.__data = tempArray<br><br>    def __str__(self):<br>        string = "Queue: size=%d, capacity=%d, front[" % (self.getSize(), self.getCapacity())<br>        i = self.__front<br>        while not i == self.__tail:<br>            string += str(self.__data[i])<br>            if not (i + 1) % len(self.__data) == self.__tail:<br>                string += ", "<br>            i = (i + 1) % len(self.__data)<br>        string += "] tail"<br>        return string<br>
1
import random<br><br>from ep2_SelectionSort.Clocker import clock<br>from ep5_Queue.ArrayQueue import ArrayQueue<br>from ep5_Queue.LoopQueue import LoopQueue<br><br><br>@clock<br>def timer(capacity, queueInstance):<br>    for i in range(capacity):<br>        queueInstance.enqueue(random.randint(0, 2 ** 15 - 1))<br>    for i in range(capacity):<br>        queueInstance.dequeue()<br>    return capacity<br><br><br>if __name__ == '__main__':<br>    capacity = 10000000<br>    arrayQueue = ArrayQueue()<br>    loopQueue = LoopQueue()<br>    timer(capacity, arrayQueue)<br>    timer(capacity, loopQueue)<br>
1
import time<br><br><br>def clock(func):<br>    def clocked(*args):<br>        t0 = time.perf_counter()<br>        result = func(*args)<br>        elapsed = time.perf_counter() - t0<br>        name = func.__name__<br>        print('Time elapsed: %0.8fs, sequence length=%d' % (elapsed, result))<br>        return result<br>    return clocked<br>


提问者 Mr__Xin 2020-12-18 23:05:34
1
import array as builtin_array<br>import random<br><br><br>class Array:<br>    def __init__(self, capacity: int = 20):<br>        self._typeCode = 'h'<br>        self.__data = builtin_array.array(self._typeCode)<br>        # self.__capacity = capacity<br>        for i in range(capacity):<br>            self.__data.append(0)<br>        self.__size = 0<br><br>    # def check(self):<br>    #     if len(self.__data) == self.__capacity:<br>    #         raise<br><br>    def getSize(self):<br>        return self.__size<br><br>    def getCapacity(self):<br>        return len(self.__data)<br><br>    def isEmpty(self):<br>        return self.__size == 0<br><br>    def add(self, index, e):<br>        if index < 0 or index > self.__size:<br>            raise ValueError("索引不能小于0且不能大于容量!")<br>        if self.__size == len(self.__data):<br>            self.__resize(2 * len(self.__data))<br>        for i in range(self.__size - 1, index - 1, -1):<br>            self.__data[i+1] = self.__data[i]<br>        self.__data[index] = e<br>        self.__size += 1<br><br>    def addFirst(self, e):<br>        self.add(0, e)<br><br>    def addLast(self, e):<br>        self.add(self.__size, e)<br><br>    def get(self, index):<br>        if index < 0 or index >= self.__size:<br>            raise ValueError("索引不能小于0且不能大于等于容量!")<br>        return self.__data[index]<br><br>    def getFirst(self):<br>        return self.get(0)<br><br>    def getLast(self):<br>        return self.get(self.__size - 1)<br><br>    def set(self, index, e):<br>        if index < 0 or index >= self.__size:<br>            raise ValueError("索引不能小于0且不能大于等于容量!")<br>        self.__data[index] = e<br><br>    def isContains(self, e):<br>        for i in range(self.__size):<br>            if self.__data[i] == e:<br>                return True<br>        return False<br><br>    def find(self, e, isFindAll: bool = False):<br>        tempArray = builtin_array.array(self._typeCode)<br>        for i in range(self.__size):<br>            if self.__data[i] == e:<br>                if isFindAll:<br>                    tempArray.append(i)<br>                else:<br>                    return i<br>        return tempArray if len(tempArray) else -1<br><br>    def remove(self, index):<br>        if index < 0 or index >= self.__size:<br>            raise ValueError("索引不能小于0且不能大于等于容量!")<br>        temp = self.__data[index]<br>        for i in range(index, self.__size - 1):<br>            self.__data[i] = self.__data[i + 1]<br>        self.__size -= 1<br>        self.__data[self.__size] = 0<br>        if self.__size == int(len(self.__data) / 2) and int(len(self.__data) / 2):<br>            self.__resize(int(len(self.__data) / 2))<br>        return temp<br><br>    def removeFirst(self):<br>        return self.remove(0)<br><br>    def removeLast(self):<br>        return self.remove(self.__size - 1)<br><br>    def removeElement(self, e, isRemoveAll: bool = False):<br>        if isRemoveAll:<br>            tempArray = self.find(e, isFindAll=True)<br>            if tempArray == -1 or not len(tempArray):<br>                return None<br>            i = 0<br>            for ins in tempArray:<br>                self.remove(ins - i)<br>                i += 1<br>        else:<br>            index = self.find(e, isFindAll=False)<br>            if index != -1:<br>                self.remove(index)<br><br>    def __resize(self, newCapacity: int):<br>        # print(self._typeCode)<br>        newData = builtin_array.array(self._typeCode)<br>        for i in range(newCapacity):<br>            newData.append(0)<br>        for i in range(self.__size):<br>            newData[i] = self.__data[i]<br>        self.__data = newData<br>        # self.__capacity = newCapacity<br><br>    def __str__(self):<br>        # string = "Array: size=%d, capacity=%d\n[" % (self.__size, self.__capacity)<br>        string = "Array: size=%d, capacity=%d\n[" % (self.__size, len(self.__data))<br>        for i in range(self.__size):<br>            string += str(self.__data[i])<br>            if not i == self.__size - 1:<br>                string += ", "<br>        string += "]"<br>        return string<br>
1
from ep3_Array.Array import Array<br><br><br>class ArrayQueue:<br>    def __init__(self, capacity: int = 20):<br>        self.__array = Array(capacity)<br><br>    def enqueue(self, e):<br>        self.__array.addLast(e)<br><br>    def dequeue(self):<br>        self.__array.removeLast()<br><br>    def getFront(self):<br>        self.__array.getFirst()<br><br>    def getSize(self):<br>        return self.__array.getSize()<br><br>    def isEmpty(self):<br>        return self.__array.isEmpty()<br><br>    def getCapacity(self):<br>        return self.__array.getCapacity()<br><br>    def __str__(self):<br>        string = "Queue: front ["<br>        for i in range(self.getSize()):<br>            string += str(self.__array.get(i))<br>            if not i == self.getSize() - 1:<br>                string += ", "<br>        string += "] tail"<br>        return string<br>


liuyubobobo 2020-12-17 16:34:02

我再看一眼你的 ArrayQueue 的 Python 代码?

  • 提问者 Mr__Xin #1
    1
    import array as builtin_array<br>import random<br><br><br>class Array:<br>    def __init__(self, capacity: int = 20):<br>        self._typeCode = 'h'<br>        self.__data = builtin_array.array(self._typeCode)<br>        # self.__capacity = capacity<br>        for i in range(capacity):<br>            self.__data.append(0)<br>        self.__size = 0<br><br>    # def check(self):<br>    #     if len(self.__data) == self.__capacity:<br>    #         raise<br><br>    def getSize(self):<br>        return self.__size<br><br>    def getCapacity(self):<br>        return len(self.__data)<br><br>    def isEmpty(self):<br>        return self.__size == 0<br><br>    def add(self, index, e):<br>        if index < 0 or index > self.__size:<br>            raise ValueError("索引不能小于0且不能大于容量!")<br>        if self.__size == len(self.__data):<br>            self.__resize(2 * len(self.__data))<br>        for i in range(self.__size - 1, index - 1, -1):<br>            self.__data[i+1] = self.__data[i]<br>        self.__data[index] = e<br>        self.__size += 1<br><br>    def addFirst(self, e):<br>        self.add(0, e)<br><br>    def addLast(self, e):<br>        self.add(self.__size, e)<br><br>    def get(self, index):<br>        if index < 0 or index >= self.__size:<br>            raise ValueError("索引不能小于0且不能大于等于容量!")<br>        return self.__data[index]<br><br>    def getFirst(self):<br>        return self.get(0)<br><br>    def getLast(self):<br>        return self.get(self.__size - 1)<br><br>    def set(self, index, e):<br>        if index < 0 or index >= self.__size:<br>            raise ValueError("索引不能小于0且不能大于等于容量!")<br>        self.__data[index] = e<br><br>    def isContains(self, e):<br>        for i in range(self.__size):<br>            if self.__data[i] == e:<br>                return True<br>        return False<br><br>    def find(self, e, isFindAll: bool = False):<br>        tempArray = builtin_array.array(self._typeCode)<br>        for i in range(self.__size):<br>            if self.__data[i] == e:<br>                if isFindAll:<br>                    tempArray.append(i)<br>                else:<br>                    return i<br>        return tempArray if len(tempArray) else -1<br><br>    def remove(self, index):<br>        if index < 0 or index >= self.__size:<br>            raise ValueError("索引不能小于0且不能大于等于容量!")<br>        temp = self.__data[index]<br>        for i in range(index, self.__size - 1):<br>            self.__data[i] = self.__data[i + 1]<br>        self.__size -= 1<br>        self.__data[self.__size] = 0<br>        if self.__size == int(len(self.__data) / 2) and int(len(self.__data) / 2):<br>            self.__resize(int(len(self.__data) / 2))<br>        return temp<br><br>    def removeFirst(self):<br>        return self.remove(0)<br><br>    def removeLast(self):<br>        return self.remove(self.__size - 1)<br><br>    def removeElement(self, e, isRemoveAll: bool = False):<br>        if isRemoveAll:<br>            tempArray = self.find(e, isFindAll=True)<br>            if tempArray == -1 or not len(tempArray):<br>                return None<br>            i = 0<br>            for ins in tempArray:<br>                self.remove(ins - i)<br>                i += 1<br>        else:<br>            index = self.find(e, isFindAll=False)<br>            if index != -1:<br>                self.remove(index)<br><br>    def __resize(self, newCapacity: int):<br>        # print(self._typeCode)<br>        newData = builtin_array.array(self._typeCode)<br>        for i in range(newCapacity):<br>            newData.append(0)<br>        for i in range(self.__size):<br>            newData[i] = self.__data[i]<br>        self.__data = newData<br>        # self.__capacity = newCapacity<br><br>    def __str__(self):<br>        # string = "Array: size=%d, capacity=%d\n[" % (self.__size, self.__capacity)<br>        string = "Array: size=%d, capacity=%d\n[" % (self.__size, len(self.__data))<br>        for i in range(self.__size):<br>            string += str(self.__data[i])<br>            if not i == self.__size - 1:<br>                string += ", "<br>        string += "]"<br>        return string<br>
    1
    from ep3_Array.Array import Array<br><br><br>class ArrayQueue:<br>    def __init__(self, capacity: int = 20):<br>        self.__array = Array(capacity)<br><br>    def enqueue(self, e):<br>        self.__array.addLast(e)<br><br>    def dequeue(self):<br>        self.__array.removeLast()<br><br>    def getFront(self):<br>        self.__array.getFirst()<br><br>    def getSize(self):<br>        return self.__array.getSize()<br><br>    def isEmpty(self):<br>        return self.__array.isEmpty()<br><br>    def getCapacity(self):<br>        return self.__array.getCapacity()<br><br>    def __str__(self):<br>        string = "Queue: front ["<br>        for i in range(self.getSize()):<br>            string += str(self.__array.get(i))<br>            if not i == self.getSize() - 1:<br>                string += ", "<br>        string += "] tail"<br>        return string<br>


    2020-12-17 22:52:31
  • liuyubobobo 回复 提问者 Mr__Xin #2

    我想在我的本地测试一下你的代码,你之前贴的 LoopQueue 和相关的测试代码格式是乱的,可能是慕课网的 bug,能不能重新贴一下?上面 Array 和 ArrayQueue 的代码格式没有问题。

    2020-12-20 20:54:57
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2601    人
  • 解答问题       1094    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码