Entiendo que una lista en realidad contiene valores y una secuencia es un alias de IEnumerable<T>
. En el desarrollo práctico de F #, ¿cuándo debería usar una secuencia en lugar de una lista?
Aquí hay algunas razones por las que puedo ver cuándo sería mejor una secuencia:
- Al interactuar con otros lenguajes .NET o bibliotecas que lo requieran
IEnumerable<T>
. - Necesita representar una secuencia infinita (probablemente no sea realmente útil en la práctica).
- Necesita una evaluación perezosa.
¿Hay otros?
seq
generado de esa manera producirá diferentes números aleatorios cada vez que lo mire. Eso obviamente puede ser una fuente de errores no deterministas ...Respuestas:
Creo que tu resumen de cuándo elegir
Seq
es bastante bueno. Aquí hay algunos puntos adicionales:Seq
por defecto al escribir funciones, porque entonces funcionan con cualquier colección .NETSeq
si necesita funciones avanzadas comoSeq.windowed
oSeq.pairwise
Creo que elegir
Seq
por defecto es la mejor opción, entonces, ¿cuándo elegiría un tipo diferente?Úselo
List
cuando necesite procesamiento recursivo usando loshead::tail
patrones(para implementar algunas funciones que no están disponibles en la biblioteca estándar)
Úselo
List
cuando necesite una estructura de datos simple e inmutable que pueda construir paso a paso(por ejemplo, si necesita procesar la lista en un hilo, para mostrar algunas estadísticas, y al mismo tiempo continuar construyendo la lista en otro hilo a medida que recibe más valores, es decir, de un servicio de red)
Úselo
List
cuando trabaje con listas cortas: la lista es la mejor estructura de datos para usar si el valor a menudo representa una lista vacía , porque es muy eficiente en ese escenarioÚselo
Array
cuando necesite grandes colecciones de tipos de valores(los arreglos almacenan datos en un bloque de memoria plano, por lo que son más eficientes en memoria en este caso)
Úselo
Array
cuando necesite acceso aleatorio o más rendimiento (y localidad de caché)fuente
List
[...] cuando necesite una estructura de datos simple e inmutable que pueda construir paso a paso [...] y al mismo tiempo continuar construyendo la lista en otro hilo [...]" ¿Puede por favor ampliar su queriendo decir aquí / ¿cómo funciona? Gracias.x::xs
sin romper ningún trabajador existente que pueda estar en proceso de iteraciónxs
También prefiera
seq
cuando:No desea mantener todos los elementos en la memoria al mismo tiempo.
El rendimiento no es importante.
Debe hacer algo antes y después de la enumeración, por ejemplo, conectarse a una base de datos y cerrar la conexión.
No está concatenando (repetidamente
Seq.append
se desbordará la pila).Preferir
list
cuando:Hay pocos elementos.
Estarás anteponiendo y decapitando mucho.
Ni
seq
tampocolist
son buenos para el paralelismo, pero eso tampoco significa necesariamente que sean malos. Por ejemplo, puede utilizar cualquiera de los dos para representar un pequeño grupo de elementos de trabajo separados que se realizarán en paralelo.fuente
Solo un pequeño punto:
Seq
yArray
son mejores queList
por paralelismo.Tiene varias opciones: PSEQ de F # PowerPack, Array.Parallel módulo y Async.Parallel (computación asíncrona). List es terrible para la ejecución paralela debido a su naturaleza secuencial (
head::tail
composición).fuente
Array
oPSeq
son mucho mejores.seq
es mejor quelist
por paralelismo?seq
también son horribles para la ejecución paralela debido a su naturaleza secuencial ...list es más funcional y compatible con las matemáticas. cuando cada elemento es igual, 2 listas son iguales.
la secuencia no lo es.
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)
fuente
Siempre debe exponer
Seq
en sus API públicas. UtiliceList
yArray
en sus implementaciones internas.fuente
Seq
se ve como unIEnumerable<T>
?seq
son tan malos para el paralelismo.