목록이 아닌 F #에서 시퀀스를 사용하는 경우
나는 이해 리스트가 실제로 값을 포함하고, 순서 의 별칭입니다 IEnumerable<T>
. 실제 F # 개발에서 목록이 아닌 시퀀스를 언제 사용해야합니까?
시퀀스가 더 나은시기를 알 수있는 몇 가지 이유는 다음과 같습니다.
- .NET이 필요한 다른 .NET 언어 또는 라이브러리와 상호 작용할 때
IEnumerable<T>
. - 무한 시퀀스를 나타내야합니다 (실제로 실제로 유용하지 않을 수 있음).
- 게으른 평가가 필요합니다.
다른 사람이 있습니까?
언제 선택할지에 대한 요약 Seq
이 꽤 좋다고 생각합니다 . 다음은 몇 가지 추가 사항입니다.
Seq
함수를 작성할 때 기본적으로 사용 합니다. 모든 .NET 컬렉션에서 작동하기 때문입니다.- 또는
Seq
같은 고급 기능이 필요한 경우 사용하십시오.Seq.windowed
Seq.pairwise
Seq
기본적으로 선택 하는 것이 최선의 선택이라고 생각하는데 언제 다른 유형을 선택해야합니까?
사용
List
하면 사용하여 처리하는 재귀 필요로 할 때head::tail
패턴
(표준 라이브러리에서 사용할 수없는 몇 가지 기능을 구현하는)List
단계별로 구축 할 수있는 단순 불변 데이터 구조가 필요할 때 사용 합니다
(예를 들어, 한 스레드에서 목록을 처리해야하는 경우-일부 통계 표시-동시에 수신 할 때 다른 스레드에서 목록 작성을 계속해야하는 경우). 더 많은 값, 즉 네트워크 서비스에서)List
짧은 목록으로 작업 할 때 사용 -목록은 값이 빈 목록을 나타내는 경우 사용하기에 가장 좋은 데이터 구조 입니다. 해당 시나리오에서 매우 효율적이기 때문입니다.Array
값 유형의 대규모 컬렉션이 필요할 때 사용 합니다
(배열은 데이터를 플랫 메모리 블록에 저장하므로이 경우 메모리 효율성이 더 높습니다).Array
임의 액세스 또는 더 많은 성능 (및 캐시 지역성)이 필요할 때 사용 합니다.
또한 다음과 같은 경우를 선호합니다 seq
.
모든 요소를 동시에 메모리에 저장하고 싶지는 않습니다.
성능은 중요하지 않습니다.
열거 전후에 무언가를해야합니다. 예를 들어 데이터베이스에 연결하고 연결을 닫습니다.
연결하지 않습니다 (반복
Seq.append
하면 스택 오버플로가 발생합니다).
선호하는 list
경우 :
요소가 거의 없습니다.
당신은 많은 것을 준비하고 참수하게 될 것입니다.
둘 다 병렬 처리에 좋지 seq
도 list
좋지 않지만 반드시 나쁘다는 것을 의미하지는 않습니다. 예를 들어, 둘 중 하나를 사용하여 병렬로 수행 할 개별 작업 항목의 작은 무리를 나타낼 수 있습니다.
그냥 하나의 작은 점 : Seq
및 Array
더 나은보다 List
병렬 처리합니다.
당신은 몇 가지 옵션이 있습니다 : PSeq를 F # 파워팩에서 Array.Parallel의 모듈과 Async.Parallel (비동기 계산). 목록은 순차적 인 특성 ( head::tail
구성) 으로 인해 병렬 실행에 끔찍합니다 .
목록이 더 기능적이고 수학 친화적입니다. 각 요소가 같으면 2 개의 목록이 같습니다.
순서는 아닙니다.
let list1 = [1..3]
let list2 = [1..3]
printfn "equal lists? %b" (list1=list2)
let seq1 = seq {1..3}
let seq2 = seq {1..3}
printfn "equal seqs? %b" (seq1=seq2)
항상 Seq
공개 API에 노출해야합니다 . 내부 구현에서 List
및 사용하십시오 Array
.
참고 URL : https://stackoverflow.com/questions/10814203/when-to-use-a-sequence-in-f-as-opposed-to-a-list
'program tip' 카테고리의 다른 글
UTF-8 이메일을 보내는 방법은 무엇입니까? (0) | 2020.10.24 |
---|---|
Dapper.NET에서 CommandTimeout 조정? (0) | 2020.10.24 |
double equals vs is in python (0) | 2020.10.24 |
저장 프로 시저에 매개 변수 배열 전달 (0) | 2020.10.24 |
조각간에 데이터를 전달하는 방법 (0) | 2020.10.24 |