166 votes

Pourquoi les pandas fusionnent-ils en python plus vite que data.table ne se fusionne en R?

Je suis récemment tombé sur les pandas de la bibliothèque pour python, qui, selon ce test effectue très vite en mémoire les fusions. C'est même plus rapide que les données.tableau paquet dans R (ma langue de choix pour l'analyse).

Pourquoi est - pandas , donc beaucoup plus rapide que l' data.table? Est-ce en raison d'une vitesse inhérente avantage de python a plus de R, ou est-il un compromis, je ne suis pas au courant? Est-il un moyen pour effectuer intérieure et extérieure rejoint en data.table sans avoir recours à l' merge(X, Y, all=FALSE) et merge(X, Y, all=TRUE)?

Comparison

Voici la R code et le code Python utilisé pour comparer les différents forfaits.

191voto

Wes McKinney Points 17545

La raison pandas est plus rapide est parce que je suis venu avec un meilleur algorithme, qui est mis en œuvre très soigneusement à l'aide d'un rapide de la table de hachage de mise en œuvre - klib et en C/Cython pour éviter l'interpréteur Python frais généraux pour les non-vectorizable pièces. L'algorithme est décrit en détail dans ma présentation: Un coup d'oeil à l'intérieur de pandas de conception et de développement.

La comparaison avec data.table est en fait un peu intéressant, parce que le point R data.table , c'est qu'il contient du pré-calculé des indices pour les différentes colonnes à accélérer les opérations, comme la sélection de données et les fusions. Dans ce cas (base de données des jointures des pandas DataFrame contient pas de pré-calculée de l'information qui est utilisé pour la fusion, pour ainsi dire, c'est un "froid" de fusion. Si j'avais stocké les factorisée versions de la jointure des clés, la jointure serait nettement plus rapide que factoriser est le plus gros goulot d'étranglement pour cet algorithme.

Je dois également ajouter que la conception interne de pandas DataFrame est beaucoup plus favorable à ces types d'opérations de R de données.cadre (qui est juste une liste de tableaux en interne).

128voto

Matt Dowle Points 20936

Il ressemble à Wes peut-être découvert un problème connu en data.table lorsque le nombre de chaînes uniques (niveaux) est importante: 10 000 personnes.

N' Rprof() révèlent la plupart du temps passé dans l'appel sortedmatch(levels(i[[lc]]), levels(x[[rc]])? Ce n'est pas vraiment le rejoindre lui-même (l'algorithme), mais d'une étape préliminaire.

De récents efforts ont été déployés pour permettre des colonnes de caractères dans les touches, ce qui devrait résoudre le problème en intégrant plus étroitement avec le R est propre chaîne globale de la table de hachage. Certains résultats sont déjà signalées par test.data.table() mais ce code n'est pas accroché encore à remplacer les niveaux de niveaux de match.

Sont pandas fusionne plus rapide que l' data.table pour régulièrement les colonnes de type entier? Que devrait être un moyen d'isoler l'algorithme lui-même vs facteur de questions.

Aussi, data.table a l'heure de la série fusion dans l'esprit. Deux aspects: i) colonne multi commandé clés telles que (id,datetime) ii) en vigueur rapide de jointure (roll=TRUE).k.un. dernière observation reportée.

Je vais avoir besoin de quelques temps pour confirmer que c'est la première fois que j'ai vu de la comparaison de data.table tel que présenté.


Mise à JOUR de données.tableau v1.8.0 publié en juillet 2012

  • Fonction interne sortedmatch() retiré et remplacé par chmatch() lors de l'appariement j'niveaux à x niveaux pour les colonnes de type "facteur". Cette étape préliminaire était à l'origine un (connu) ralentissement considérable quand le nombre des niveaux d'un facteur de colonne est grande (par exemple, >10 000 habitants). Exacerbée dans les tests de rejoindre quatre colonnes, comme l'a démontré par Wes McKinney (l'auteur du paquet Python Pandas). De correspondance de 1 million de chaînes de qui dont 600 000 sont uniques, est maintenant réduit à partir de 16 ans pour 0,5 s, par exemple.

aussi dans cette version était :

  • les colonnes de caractères sont désormais autorisés dans les touches et sont préférés à facteur. les données.tableau() et setkey() de ne plus contraindre à caractère facteur. Les facteurs sont toujours pris en charge. Implémente FR#1493, FR#1224 et (partiellement) FR#951.

  • De nouvelles fonctions chmatch() et le %de menton%, soit plus rapidement les versions de match() et %dans% pour le personnage de vecteurs. R interne du cache de chaîne est utilisés (pas de table de hachage est construit). Ils sont environ 4 fois plus vite de match() sur l'exemple ?chmatch.

Comme d'Sep 2013 données.le tableau est v1.8.10 sur CRAN et nous travaillons sur v1.9.0. NEWS est mise à jour en direct.


Mais comme je l'ai écrit à l'origine, ci-dessus :

data.table a l'heure de la série fusion dans l'esprit. Deux aspects: i) multi colonne commandée clés telles que (id,datetime) ii) en vigueur rapide join (roll=TRUE).k.un. dernière observation reportée.

Si les Pandas equi jointure de deux colonnes de caractères est probablement encore plus rapide que de données.table. Car il sonne comme il hache le combiné deux colonnes. les données.le tableau n'a pas de hachage de la clé, car il a en vigueur commandé se joint à l'esprit. Une "clé" dans les données.le tableau est littéralement juste l'ordre de tri (similaire à un index cluster SQL; à savoir, c'est comment les données sont ordonnées dans la RAM). Sur la liste est d'ajouter des clés secondaires, par exemple.

En résumé, la flagrante différence de vitesse mis en évidence par ce particulier de deux caractères-colonne de test avec plus de 10 000 chaînes uniques ne devrait pas être aussi mauvais maintenant, depuis que le problème a été résolu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X