J'ai remarqué que lorsque vous multipliez un Dataframe par un scalaire, il s'agit d'un ordre de grandeur plus lentement que de multiplier la matrice numpie. La lenteur augmente plus que linéairement avec la taille de Dataframe. Python 3.6, Pandas 0.24.0.
Y a-t-il une meilleure solution de contournement? P>
Pourquoi se multipliera-t-il par un scalaire si lent dans les pandas? Cela ressemble à un bug de performance pour moi. P>
3 Réponses :
Y a-t-il une meilleure solution de contournement? P>
Vous pouvez travailler avec une matrice numpue et un constructeur de DataFrame, si la performance est importante: p>
xxx pré>
xxx pré> blockQuote>
Dans ce qui suit, je voulais vous montrer comment vous pouvez rendre votre code plus rapide. Mais ensuite j'ai réalisé que cela dépend également de la taille de l'ensemble de données utilisé. Néanmoins, regardons pour la première fois votre problème. Je vais exécuter le même code sur ma machine afin de jauger la comparaison. Je ferai tout pour un gros jeu de données (100 fois le vôtre) et un petit (votre ensemble de données). P>
Pandas est lent sur certains calculs numériques. Voyons à quel point les opérations obligatoires équivalentes sont lentes. p>
Utilisation de Pandas 0.23.4 sur Linux 32 noyaux, dans un ordinateur portable Jupyter (Utilisation de Pandas 1.0.4 sur Windows 2 Cores pour les résultats à la fin, dans un ordinateur portable Jupyter) P>
Remarque, que tous les résultats ont été trouvés dans un ordinateur portable Jupyter. Je n'ai changé aucun paramètre. Cela pourrait être que, dans des conditions du monde réel, les résultats diffèrent. P>
dans les mesures suivantes mes mesures. P>
Remarque, que j'utilise un peu plus de données, 100 fois plus. De plus, j'utilise la commande Magic %% Time pour la mesure au lieu de %% TimeIt. P>
%%timeit df * df 165 ms ± 5.96 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) %%timeit a * a 251 ms ± 9.71 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
En attendant, j'ai trouvé la raison, pourquoi Pandas est plus rapide puis numpy dans mon cas par rapport à votre cas: Pandas utilise numexpr en arrière-plan, si et seulement s'il est installé.
Vous pouvez créer des pandas performer mieux puis NUMPY (seul) si vous installez le module numexpr (et ne sortez pas de l'utilisation. Il est activé par défaut). p>
Regardez cela pour plus d'explications: p>
Pourquoi Pandas est-il plus rapide alors Numby sur des opérations mathématiques simples? p>
Ce faisant, votre exemple ci-dessus sera certainement mieux performer. J'ai testé le comportement des pandas pour les multiplications et autres opérateurs: multiplication de la gauche et droite avec des scalaires, des vecteurs de rangée, des vecteurs de colonne et des matrices. p>
Travailler avec les matrices engendrées sous-jacentes bénéficiera toujours de la performance. Notez que vous modifiez également sur place dans le deuxième cas, ce qui contribue également à l'efficacité