php 편집기 Apple은 Go의 슬라이스에서 요소를 효율적으로 삭제하는 방법을 소개합니다. Go 언어에서는 슬라이스의 요소를 삭제하는 것이 일반적인 작업입니다. 그러나 슬라이스의 특성상 요소를 직접 삭제하면 슬라이스의 길이가 변경되어 후속 작업에 영향을 줄 수 있습니다. 슬라이스의 요소를 효율적으로 삭제하기 위해 슬라이스의 특성과 일부 내장 함수를 사용할 수 있습니다. 일반적으로 사용되는 몇 가지 방법을 아래에서 자세히 소개합니다.
슬라이스 요소를 제거하는 방법에는 여러 가지가 있습니다. 하지만 많은 조각 처리를 수행하는 애플리케이션이 있다면 어떻게 될까요? Go 슬라이스는 새로운 요소를 추가하는 데 최적화되어 있지만, 슬라이스에서 요소를 제거하는 효율적인 방법이 있습니까(속도뿐만 아니라 메모리 최적화 측면에서도).
슬라이스에 대해 알고 있습니다. Go 1.21에 도입된 삭제 기능은 뒤에서 다음과 같은 잘 알려진 기술을 사용합니다.
으아악이 경우 기본 배열이 줄어들지 않은 것 같습니다. 이는 속도 면에서는 좋지만, 요소가 너무 많고(100k 또는 1M) 이를 아주 적은 수(10개)로 줄이면 어떻게 될까요? 슬라이스 용량을 늘리는 데 사용되는 것과 같은 메모리 최적화는 없는 것 같습니다.
슬라이스의 요소 순서를 유지할 필요가 없는 경우 다음 방법을 사용할 수 있습니다(플레이그라운드 링크로 이동):
으아악이것은 큰 조각이 있고 제거할 요소 수가 적을 때 유용합니다(그 뒤에 있는 아이디어는 적은 수의 조각 요소를 복사하는 것입니다).
메모리의 경우 용량은 두 경우 모두 동일하며 줄어들지 않습니다. 예:
으아악그렇다면 메모리 사용량을 최적화할 수 있는 방법은 없을까요? 예를 들어, 슬라이스 길이가 용량의 절반 미만인 경우 용량을 절반으로 줄입니다.
또한 이와 같은 기술과 같이 이 작업을 효율적으로 수행하는 방법을 알고 싶습니다. s[:len(s):len(s)]
(slices.Clip에서 사용하는 전체 슬라이스 표현식)은 기본 배열을 줄이지 않습니다. 추가를 피하기 위해 슬라이스 구조에 새 용량만 저장합니다. new 요소가 하위 슬라이스에 연결될 때 상위 슬라이스 요소를 재정의합니다(이 제안에서 언급한 대로).
"일반적으로 가장 좋은" 솔루션은 없습니다. 귀하의 질문에 여러 가지 접근 방식을 보여 주셨는데, 각 접근 방식은 특정 시나리오에 대해 다른 접근 방식보다 더 나을 수 있습니다.
이런 상황에 처해 있다면 많은 요소 중에서 몇 가지 요소를 유지하고 싶을 때 해당 요소를 삭제하지 마세요. 이러한 요소를 사용하여 새 슬라이스를 만듭니다. 속도가 빨라지는 것 외에도 메모리 문제도 확실히 해결됩니다.
새 슬라이스를 할당하고 사용하는 것 외에 전체 슬라이스 표현식을 사용하면 메모리 사용량을 줄일 수 없습니다. 백업 배열에 대한 참조가 있는 한 축소되지 않습니다(적어도 현재 Go 버전에서는 그렇지 않음). 대규모 지원 배열이 할당되었지만 그 중 작은 부분만 사용되는 상황이 발생하는 경우 새 슬라이스를 할당하고 요소를 수동으로 복사하여 대규모 배열이 가비지 수집되도록 할 수 있습니다.
또한 많은 요소를 제거해야 할 매우 큰 슬라이스가 있는 경우 슬라이스가 사용하기에 가장 적합한 데이터 구조가 아닐 수도 있다는 점을 고려하세요. 예를 들어 연결된 목록을 사용해 보거나 지도를 사용해 볼 수도 있습니다. 연결 목록이나 지도에서 요소를 삭제하는 것이 훨씬 빨라지고 아래와 같이 지도는 빠른(O(n)
) 조회 시간도 제공합니다.
위 내용은 Go의 슬라이스에서 요소를 효율적으로 제거하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!