微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

相同算法的两种实现-运行时间非常不同

如何解决相同算法的两种实现-运行时间非常不同

此问题来自Coursera上的数据结构课程。我已经通过两种方式实现了相同的算法,并且在第二种实现中,我得到了更好的运行时间。

我尝试使用cProfile对两个程序进行性能分析,但是这些信息似乎并没有太大帮助。不过,我还是包含了配置文件运行中的图像。如果有一种方法可以通过查看探查器的输出来了解性能差异,那么我想知道我该怎么做。

最重要的是,我只想知道是什么使我的性能出现了如此巨大的差异。

包含以下内容是问题说明,程序输入文件链接以及我的两个实现的链接




程序输入:链接https://drive.google.com/file/d/1KUA2qq4Hpi5TcLar2Xj5DbPzNSEln_9K/view?usp=sharing


问题定义:

Problem Statements1

Problem Statements2




实施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()

CProfile2

CProfile1




实施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 举报,一经查实,本站将立刻删除。