问题描述
此问题来自Coursera上的数据结构课程。我已经通过两种方式实现了相同的算法,并且在第二种实现中,我得到了更好的运行时间。
我尝试使用cProfile对两个程序进行性能分析,但是这些信息似乎并没有太大帮助。不过,我还是包含了配置文件运行中的图像。如果有一种方法可以通过查看探查器的输出来了解性能差异,那么我想知道我该怎么做。
最重要的是,我只想知道是什么使我的性能出现了如此巨大的差异。
包含以下内容是问题说明,程序输入文件的链接以及我的两个实现的链接。
程序输入:链接:https://drive.google.com/file/d/1KUA2qq4Hpi5TcLar2Xj5DbPzNSEln_9K/view?usp=sharing
问题定义:
实施1:链接:https://drive.google.com/file/d/1uig28lsWUcvsGIRTGLQ11zqdKw8aY1rN/view?usp=sharing
# python3
import time
from collections import namedtuple,deque
Request = namedtuple("Request",["arrived_at","time_to_process"])
Response = namedtuple("Response",["was_dropped","started_at"])
Packet = namedtuple("Packet",['start_time','end_time'])
start_time = 0
end_time = 0
class Buffer:
def __init__(self,size):
self.size = size
self.maxSize = size
self.last_run_time = 0
self.unprocessed = deque()
def process(self,request):
self.deallocate_until(request.arrived_at)
if self.size > 0:
packet_start_time = max(self.last_run_time,request.arrived_at)
packet_end_time = packet_start_time + request.time_to_process
packet = Packet(packet_start_time,packet_end_time)
self.unprocessed.append(packet)
self.last_run_time = self.last_run_time + request.time_to_process
self.size = self.size - 1
response = Response(False,packet_start_time)
else:
response = Response(True,-1)
return response
def deallocate_until(self,run_time):
while len(self.unprocessed) > 0:
packet = self.unprocessed[0]
if packet.end_time <= run_time:
self.unprocessed.popleft()
self.size = min(self.size+1,self.maxSize)
else:
break
def process_requests(requests,buffer):
responses = []
ss_start_time = time.time()
for request in requests:
responses.append(buffer.process(request))
ss_end_time = time.time()
print("--- %s seconds ---" % (ss_end_time - ss_start_time))
return responses
def main():
buffer_size,n_requests = map(int,raw_input().split())
requests = []
for _ in range(n_requests):
arrived_at,time_to_process = map(int,raw_input().split())
requests.append(Request(arrived_at,time_to_process))
buffer = Buffer(buffer_size)
responses = process_requests(requests,buffer)
# for response in responses:
# print(response.started_at if not response.was_dropped else -1)
if __name__ == "__main__":
main()
实施2:链接:https://drive.google.com/file/d/1ZQLhQ020fBdxs3SqZ9McrRklydRwBw-0/view?usp=sharing
if ($('div.questions').hasClass('clicked')) return;
$('div.questions').addClass('clicked');
...
$('div.questions').removeClass('clicked');
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)