Parece que Wes pudo haber descubierto un problema conocido data.table
cuando la cantidad de cadenas únicas ( niveles ) es grande: 10,000.
¿ Rprof()
Revela la mayor parte del tiempo dedicado a la llamada sortedmatch(levels(i[[lc]]), levels(x[[rc]])
? Esto no es realmente la unión en sí (el algoritmo), sino un paso preliminar.
Se han realizado esfuerzos recientes para permitir columnas de caracteres en las claves, lo que debería resolver ese problema al integrarse más estrechamente con la propia tabla global de hash de cadenas de R. Ya se informan algunos resultados de referencia, test.data.table()
pero ese código aún no está conectado para reemplazar los niveles de coincidencia de niveles.
¿Los pandas se fusionan más rápido que data.table
las columnas enteras normales? Esa debería ser una forma de aislar el algoritmo en sí mismo frente a los factores.
Además, data.table
tiene series temporales fusionadas en mente. Dos aspectos a eso: i) claves ordenadas de múltiples columnas como (id, fecha y hora) ii) unión prevaleciente rápida ( roll=TRUE
) también conocida como última observación llevada adelante.
Necesitaré algo de tiempo para confirmar, ya que es la primera vez que veo la comparación con la data.table
presentada.
ACTUALIZACIÓN de data.table v1.8.0 lanzado en julio de 2012
- La función interna sortedmatch () se eliminó y se reemplazó con chmatch () al hacer coincidir los niveles i con los niveles x para columnas de tipo 'factor'. Este paso preliminar estaba causando una desaceleración significativa (conocida) cuando el número de niveles de una columna de factor era grande (por ejemplo,> 10,000). Exacerbado en las pruebas de unir cuatro de esas columnas, como lo demuestra Wes McKinney (autor del paquete Python Pandas). Hacer coincidir 1 millón de cadenas de las cuales 600,000 son únicas ahora se reduce de 16s a 0.5s, por ejemplo.
También en ese lanzamiento fue:
las columnas de caracteres ahora están permitidas en las claves y se prefieren factorizar. data.table () y setkey () ya no obligan al personaje a factorizar. Los factores aún son compatibles. Implementa FR # 1493, FR # 1224 y (parcialmente) FR # 951.
Nuevas funciones chmatch () y% chin%, versiones más rápidas de match () y% in% para vectores de caracteres. Se utiliza el caché de cadenas interno de R (no se crea una tabla hash). Son aproximadamente 4 veces más rápidos que match () en el ejemplo en? Chmatch.
A partir de septiembre de 2013 data.table es v1.8.10 en CRAN y estamos trabajando en v1.9.0. NOTICIAS se actualiza en vivo.
Pero como escribí originalmente, arriba:
data.table
tiene series temporales fusionadas en mente. Dos aspectos a eso: i) claves ordenadas de múltiples columnas como (id, fecha y hora) ii) unión prevaleciente rápida ( roll=TRUE
) también conocida como última observación llevada adelante.
Por lo tanto, la unión equitativa de dos columnas de caracteres de Pandas probablemente sea aún más rápida que data.table. Ya que suena como hash las dos columnas combinadas. data.table no teclea la clave porque tiene en mente las combinaciones ordenadas predominantes. Una "clave" en data.table es literalmente solo el orden de clasificación (similar a un índice agrupado en SQL; es decir, así es como se ordenan los datos en RAM). En la lista hay que agregar claves secundarias, por ejemplo.
En resumen, la deslumbrante diferencia de velocidad resaltada por esta prueba particular de columna de dos caracteres con más de 10,000 cadenas únicas no debería ser tan mala ahora, ya que el problema conocido se ha solucionado.
data.table
simplemente hereda dedata.frame
, pero se basa en el código C bajo el capó.set()
se agregódata.table
poco después de esta discusión. Muy similar:=
pero evita la pequeña sobrecarga de[.data.table
cuando se coloca en bucle y, en consecuencia, es tan rápido comomatrix
. Por lo tanto,data.frame
se puede manipular tan rápido como la matriz. El punto de referencia está aquí .