파이썬 순환 버퍼

Zeeshan Afridi 2023년6월21일
  1. Python의 효율적인 순환 버퍼
  2. Python에서 순환 버퍼 구현
  3. 파이썬 순환 버퍼의 장점
  4. 파이썬 순환 버퍼의 단점
  5. 결론
파이썬 순환 버퍼

원형 버퍼는 링 버퍼의 다른 이름입니다. 버퍼는 마치 끝에서 끝까지 연결된 것처럼 단일 고정 크기 버퍼를 사용하는 데이터 구조입니다.

이 구조는 새로운 데이터가 한쪽 끝에 지속적으로 추가되고 다른 쪽에서 오래된 데이터가 제거될 수 있는 데이터 스트림을 관리하는 데 도움이 됩니다. 버퍼가 가득 차면 새 데이터가 가장 오래된 데이터를 덮어씁니다.

Python의 효율적인 순환 버퍼

효율적인 순환 버퍼는 데이터를 효율적으로 삽입하고 삭제할 수 있는 데이터 구조입니다.

순환 버퍼는 일반적으로 배열로 구현됩니다. 배열 헤드 포인터는 첫 번째 요소를 가리키고 꼬리 포인터는 배열의 마지막 요소를 나타냅니다.

헤드 및 테일 포인터는 배열 끝에 도달하면 둘러쌉니다. 순환 버퍼로의 삽입은 헤드 포인터를 증가시키고 해당 위치의 배열에 데이터를 쓰는 방식으로 수행됩니다.

원형 버퍼에서 삭제는 꼬리 포인터를 증가시켜 수행됩니다. 해당 데이터는 어레이에서 삭제되지 않지만 헤드 및 테일 포인터는 효과적으로 건너뜁니다.

순환 버퍼는 고정된 양의 메모리만 필요하기 때문에 효율적인 데이터 구조입니다. 구현하기도 쉽습니다.

class Buffer:
    def __init__(self, size):
        self.data = [None for i in range(size)]

    def append(self, x):
        self.data.pop(0)
        self.data.append(x)

    def get(self):
        return self.data


buf = Buffer(4)
for i in range(10):
    buf.append(i)
    print(buf.get())

출력:

[None, None, None, 0]
[None, None, 0, 1]
[None, 0, 1, 2]
[0, 1, 2, 3]
[1, 2, 3, 4]
[2, 3, 4, 5]
[3, 4, 5, 6]
[4, 5, 6, 7]
[5, 6, 7, 8]
[6, 7, 8, 9]

Python에서 순환 버퍼 구현

파이썬에서 효율적인 순환 버퍼를 구현하는 방법에는 여러 가지가 있습니다. 일반적인 접근 방식 중 하나는 큐의 앞과 뒤 모두에서 요소를 제거하고 추가하는 것을 효율적으로 지원하도록 설계된 collections.dequeue 개체를 사용하는 것입니다.

또 다른 방법은 목록을 사용하고 헤드 및 테일 인덱스를 별도로 추적하는 것입니다.

어떤 접근 방식이 가장 좋은지 알고 싶다면 응용 프로그램의 특정 요구 사항에 따라 다릅니다. 예를 들어 요소를 버퍼에서 자주 추가 및 제거해야 하고 순서가 중요하지 않은 경우 dequeue 방식이 가장 적합할 수 있습니다.

반면 요소가 버퍼에 한 번만 추가된 다음 여러 번 읽히거나 순서가 필수적인 경우 목록 접근 방식이 더 나을 수 있습니다.

Python에서 collections.enqueuecollections.dequeue를 사용하여 순환 대기열 구현

먼저 collections.enqueue 함수를 사용하여 대기열에 값을 추가합니다. 그런 다음 대기열에서 요소를 삭제하기 위해 순환 대기열에서 collection.dequeue를 사용할 수 있습니다.

작동 방식을 이해하기 위해 Python의 순환 대기열의 실제 예를 살펴보겠습니다.

예제 코드:

# implememting circular queue in python
class CircularQueue:
    def __init__(collections, k):
        collections.k = k
        collections.queue = [None] * k
        collections.head = collections.tail = -1

    # this function will insert (Enqueue) an element into the circular queue
    def enqueue1(collections, data):

        if (collections.tail + 1) % collections.k == collections.head:
            print("The queue is full\n")

        elif collections.head == -1:
            collections.head = 0
            collections.tail = 0
            collections.queue[collections.tail] = data
        else:
            collections.tail = (collections.tail + 1) % collections.k
            collections.queue[collections.tail] = data

    # this function will delete (dequeue) an element from the circular
    def dequeue1(collections):
        if collections.head == -1:
            print("The circular queue is empty\n")

        elif collections.head == collections.tail:
            temp = collections.queue[collections.head]
            collections.head = -1
            collections.tail = -1
            return temp
        else:
            temp = collections.queue[collections.head]
            collections.head = (collections.head + 1) % collections.k
            return temp

    # This function is used to print the queue
    def printCQueue1(collections):
        if collections.head == -1:
            print("Circular queue is empty")

        elif collections.tail >= collections.head:
            for i in range(collections.head, collections.tail + 1):
                print(collections.queue[i], end=" ")
            print()
        else:
            for i in range(collections.head, collections.k):
                print(collections.queue[i], end=" ")
            for i in range(0, collections.tail + 1):
                print(collections.queue[i], end=" ")
            print()


obj = CircularQueue(5)

# adding data to the queue
for i in range(1, 6):
    obj.enqueue1(i)

print("Display queue")
obj.printCQueue1()

# removing data from the queue
print("\nDelete Value:", obj.dequeue1())
print("Delete Value:", obj.dequeue1())


print("\nTwo values were deleted from the queue")
print("The new queue has 3 values now")
obj.printCQueue1()

출력:

Display queue
1 2 3 4 5

Delete Value: 1
Delete Value: 2

Two values were deleted from the queue
The new queue has 3 values now
3 4 5

파이썬 순환 버퍼의 장점

Python에서 데이터로 작업할 때 순환 버퍼를 사용하면 많은 이점이 있습니다.

  1. 한 가지 장점은 FIFO(First In, First Out) 방식으로 데이터를 저장하는 데 사용할 수 있다는 것입니다. 이렇게 하면 수신한 원래 순서대로 데이터를 처리해야 할 때 도움이 될 수 있습니다.
  2. 또 다른 장점은 순환 버퍼가 LIFO(Last In, First Out) 방식으로 데이터를 저장할 수 있다는 것입니다. 수신된 순서의 역순으로 데이터를 처리해야 할 때 유용합니다.
  3. 또한 순환 버퍼를 사용하여 임의 액세스 방식으로 데이터를 저장할 수 있습니다. 이것은 빠르고 무작위로 데이터에 액세스해야 할 때 유용할 수 있습니다.

파이썬 순환 버퍼의 단점

Python에서 순환 버퍼를 사용하는 데는 몇 가지 단점이 있습니다.

  1. 첫째, 버퍼에 있는 요소에 임의로 액세스할 수 없습니다. 이로 인해 선형 순서가 아닌 데이터로 작업하는 데 어려움이 있을 수 있습니다.
  2. 둘째, 버퍼의 크기가 고정되어 있습니다. 버퍼가 저장할 수 있는 것보다 더 많은 데이터를 저장해야 하는 경우 문제가 발생할 수 있습니다.
  3. 마지막으로 순환 버퍼는 다른 데이터 구조보다 디버그하기가 더 어려울 수 있습니다.

결론

Python 원형 버퍼는 데이터를 저장하는 빠르고 효율적인 방법입니다. 순환 데이터 버퍼는 단일 개체를 보유하는 컨테이너로 사용할 수 있는 대기열입니다.

원형 버퍼는 일반적으로 비디오 게임이나 오디오 처리와 같이 데이터가 지속적으로 추가되고 제거될 때 사용됩니다. 단일 포인터로 구현할 수 있는 반면 선형 대기열에는 두 개의 포인터가 필요합니다.

순환 버퍼는 여러 대기열로 쉽게 확장되어 동시 데이터 액세스가 가능합니다.

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn