superponer - ¿Cuándo usar una secuencia en F#en lugar de una lista?
superponer graficas en r (5)
Entiendo que una list realidad contiene valores, y una sequence es un alias para 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 que puedo ver cuando una secuencia sería mejor:
- Al interactuar con otros lenguajes .NET o bibliotecas que requieren
IEnumerable<T>. - Necesidad de representar una secuencia infinita (probablemente no sea realmente útil en la práctica).
- Necesita una evaluación perezosa.
¿Hay otros?
Creo que su resumen sobre cuándo elegir Seq es bastante bueno. Aquí hay algunos puntos adicionales:
- Use
Seqde forma predeterminada al escribir funciones, porque luego funcionan con cualquier colección .NET - Use
Seqsi necesita funciones avanzadas comoSeq.windowedoSeq.pairwise
Creo que elegir Seq por defecto es la mejor opción, entonces, ¿cuándo elegiría un tipo diferente?
Use
Listcuando necesite un procesamiento recursivo usando los patroneshead::tail
(para implementar alguna funcionalidad que no está disponible en la biblioteca estándar)Use
Listcuando necesite una estructura de datos inmutables simple que pueda compilar 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, desde un servicio de red)Use
Listcuando trabaje con listas cortas: list es la mejor estructura de datos para usar si el valor a menudo representa una lista vacía , porque es muy eficiente en ese escenarioUse
Arraycuando necesite grandes colecciones de tipos de valor
(las matrices almacenan datos en un bloque de memoria plano, por lo que son más eficientes en cuanto a la memoria en este caso)Use
Arraycuando necesite acceso aleatorio o más rendimiento (y localidad de caché)
Siempre debe exponer Seq en sus API públicas. Use List and Array en sus implementaciones internas.
Solo un pequeño punto: Seq y Array son mejores que List para el paralelismo.
Tiene varias opciones: PSeq de F # PowerPack, Array.Parallel module y Async.Parallel (cálculo asincrónico). La lista es horrible para la ejecución paralela debido a su naturaleza secuencial (composición head::tail ).
También prefiere 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á concatenándose (el
Seq.appendrepetidoSeq.appenddesbordamiento).
Prefiere la list cuando:
Hay pocos elementos
Estarás antepuesto y decapitando mucho.
Ni la seq ni la list son buenas para el paralelismo, pero eso no necesariamente significa que sean malas tampoco. Por ejemplo, podría usar cualquiera de los dos para representar un grupo pequeño de elementos de trabajo separados para hacer en paralelo.