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
Seq
de forma predeterminada al escribir funciones, porque luego funcionan con cualquier colección .NET - Use
Seq
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?
Use
List
cuando necesite un procesamiento recursivo usando los patroneshead::tail
(para implementar alguna funcionalidad que no está disponible en la biblioteca estándar)Use
List
cuando 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
List
cuando 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
Array
cuando 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
Array
cuando 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.append
repetidoSeq.append
desbordamiento).
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.