如何解决相同算法的两种实现-运行时间非常不同
此问题来自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 举报,一经查实,本站将立刻删除。