Il existe d'excellentes réponses, notamment faites par les auteurs des deux outils sur lesquels la question se pose. La réponse de Matt explique le cas signalé dans la question, qu'il a été causé par un bogue et non par un algorithme de fusion. Le bug a été corrigé le lendemain, il y a plus de 7 ans déjà.
Dans ma réponse, je fournirai des horaires à jour de l'opération de fusion pour data.table et pandas. Notez que la fusion plyr et base R n'est pas incluse.
Les timings que je présente proviennent du projet db-benchmark , un benchmark reproductible en continu. Il met à niveau les outils vers les versions récentes et réexécute les scripts de référence. Il exécute de nombreuses autres solutions logicielles. Si vous êtes intéressé par Spark, Dask et quelques autres, assurez-vous de vérifier le lien.
A partir de maintenant ... (encore à implémenter: encore une taille de données et 5 questions supplémentaires)
Nous testons 2 tailles de données différentes de la table LHS.
Pour chacune de ces tailles de données, nous exécutons 5 questions de fusion différentes.
q1: Jointure interne LHS RHS- petit sur l'entier
q2: Jointure interne LHS RHS-medium sur l'entier
q3: Jointure externe LHS RHS-medium sur l'entier
q4: Jointure interne LHS RHS-medium sur le facteur (catégorique)
q5: Jointure interne LHS RHS- gros sur entier
La table RHS est de 3 tailles différentes
- petit se traduit par une taille de LHS / 1e6
- moyen se traduit par une taille de LHS / 1e3
- grand se traduit par la taille de LHS
Dans tous les cas, il y a environ 90% de lignes correspondantes entre LHS et RHS, et aucun doublon dans la colonne de jonction RHS (pas de produit cartésien).
À partir de maintenant (exécuté le 2 novembre 2019)
pandas 0.25.3 publié le 1er novembre 2019
data.table 0.12.7 (92abb70) publié le 2 novembre 2019
Les durées ci-dessous sont en secondes, pour deux tailles de données différentes de LHS. La colonne pd2dt
est le rapport de stockage de champ ajouté du nombre de fois que les pandas sont plus lents que data.table.
+-----------+--------------+----------+--------+
| question | data.table | pandas | pd2dt |
+-----------+--------------+----------+--------+
| q1 | 0.51 | 3.60 | 7 |
| q2 | 0.50 | 7.37 | 14 |
| q3 | 0.90 | 4.82 | 5 |
| q4 | 0.47 | 5.86 | 12 |
| q5 | 2.55 | 54.10 | 21 |
+-----------+--------------+----------+--------+
+-----------+--------------+----------+--------+
| question | data.table | pandas | pd2dt |
+-----------+--------------+----------+--------+
| q1 | 6.32 | 89.0 | 14 |
| q2 | 5.72 | 108.0 | 18 |
| q3 | 11.00 | 56.9 | 5 |
| q4 | 5.57 | 90.1 | 16 |
| q5 | 30.70 | 731.0 | 23 |
+-----------+--------------+----------+--------+
data.table
hérite juste dedata.frame
, mais il repose sur du code C sous le capot.