我使用python实现循环队列,但却发现与数组队列时间差别不大
# 具体遇到的问题
我使用python实现循环队列,但却发现与数组队列时间差别不大
# 报错信息的截图
python:
java:
# 尝试过的解决思路和结果
我完全是按照同样的思想实现的,可是两者差别却不像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在这里输入代码,可通过选择【代码语言】突出显示
47
收起
正在回答 回答被采纳积分+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 代码?
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧