python IO不够快

2024-09-27 00:22:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图回答一个关于kattis的竞争性编程问题,这个问题可以找到here我的算法是正确的,但是有一个测试用例有很多输入,我的代码超时了。在python中有没有更优化的IO方法?你知道吗

from sys import stdin, stdout 
import atexit, io, sys 

buffer = io.BytesIO() 
sys.stdout = buffer

@atexit.register 
def write(): 
    sys.__stdout__.write(buffer.getvalue())

def main():
    teque = []
    for i in range(int(stdin.readline())):
        l = stdin.readline().split()
        if l[0] == 'push_back':
            teque.append(int(l[1]))

        if l[0] == 'push_front':
            teque.insert(0, int(l[1]))

        if l[0] == 'push_middle':
            if len(teque)%2==0:
                mid = len(teque)/2
            else:
                mid = (len(teque)+1)/2
            teque.insert(int(mid), int(l[1]))
        if l[0] == 'get':
            stdout.write(str(teque[int(l[1])])+'\n')

if __name__ == "__main__":
    main()

Tags: ioimportlenifmainbufferstdinstdout
1条回答
网友
1楼 · 发布于 2024-09-27 00:22:53

因此,正如我在评论中了解到的,实际上我并没有在O(1)时间内为insert编写程序,我修复了调用2个队列的问题。这个解决方案对于python3运行时仍然不够快,但是它通过了python2运行时。你知道吗

from sys import stdin, stdout 
from collections import deque

class Teque:
    def __init__(self):
        self._teque1 = deque()
        self._teque2 = deque()

    def push_back(self, x):
        self._teque2.append(x)
        if len(self._teque2) > len(self._teque1):
            self._teque1.append((self._teque2.popleft()))

    def push_front(self, x):
        self._teque1.appendleft(x)
        if len(self._teque1) > len(self._teque2):
            self._teque2.appendleft((self._teque1.pop()))

    def push_middle(self, x):
        if len(self._teque2) > len(self._teque1):
            self._teque1.append(self._teque2.popleft())
        self._teque2.appendleft(x)

    def get(self, i):
        if i >= len(self._teque1):
            return self._teque2[i-len(self._teque1)]
        return self._teque1[i]

def main():
    teque = Teque()
    for i in range(int(stdin.readline())):
        l = stdin.readline().split()
        if l[0] == 'push_back':
            teque.push_back(int(l[1]))

        elif l[0] == 'push_front':
            teque.push_front(int(l[1]))

        elif l[0] == 'push_middle':
            teque.push_middle(int(l[1]))
        else:
            stdout.write(str(teque.get(int(l[1])))+'\n')

if __name__ == "__main__":
    main()

相关问题 更多 >

    热门问题