3 Réponses :
Je pense qu'il y a au moins deux problèmes: p>
Avec le premier, vous créez une liste et des éléments ajoutés. Mais avec le second, vous gardez la concaténation de deux listes par A + B [0] .tolist () code>, qui donne dans une nouvelle liste. P> Li>
functools.reduce code> retourne un générateur, c'est-à-dire principal. En bref, ce n'est pas à la vitesse. P> li>
ol>
Ceci est étroitement lié aux réponses données à compréhension de liste VS map comme vous êtes Utilisation d'un qui dit pourquoi ne pas utiliser lambda code> avec votre instruction CODE> Réduire code> Vous envoyez un code Python à courir pour que chaque itération ralentit ainsi le réduit. Les compréhensions de la liste étaient censées être beaucoup plus efficaces et lisibles, elles sont donc la méthode de choix préférée.
ithertools.chaain.from_iterrable code> ainsi que
carte code > Ping
opérateur.Itemplgetter code>. Il en résulte la même sortie tout en utilisant des excellentes méthodes intégrées. n'a pas été testé pour la vitesse em> p>
En bref, fonction d'appel et de rétablissement des frais généraux à distance, votre algorithme avec les boucles imbriquées est O (n) et celui qui utilise Réduire est O (N²). p>
Même si les algorithmes ne seraient pas différents, l'idée que appeler une fonction a des coûts "0" provient de mathématiques, étaient des fonctions sont de belles constructions théoriques. P>
Lors de l'exécution d'un programme d'ordinateur, appeler une fonction nécessite un contexte à être initialisé - en cas de python, la création d'un objet de trame, avec des variables locales. Comme vous avez des arguments étant transmis, cela implique dans un tuple avec les arguments étant construits avant l'appel de la fonction et étant décontracté dans l'organisme de fonction (bien que ces étapes puissent être optimisées par la mise en œuvre). p>
Lors de l'approche des boucles à 2 nichées, tout ce que vous avez à faire est de créer un itérateur en code natif - bien que théoriquement, les spécifications de Python, qui impliqueraient également une fonction (le Cela ne tiendrait toutefois pas en compte la différence que vous voyez là-bas. Le principal problème est que pour chaque itéraction, lors de l'exécution __ iTER __ code de l'objet __ code > Méthode), il est généralement beaucoup plus rapide dans de véritables implémentations d'itérateurs de code natif. P>
a + b [0] .tolist () code> une nouvelle liste "C" est créée en mémoire, les valeurs de "A" sont copiées là-bas, puis Les valeurs de b [0] sont annexées à elle. Et cette nouvelle liste + copie des éléments déjà aplatie aura lieu à chaque étape. Dans le cas de la liste-comphrehension, il n'existe pas de copie redondante - un nouvel élément est placé car ils se déroulent du déroulement de la structure 2D parent et de Python est bien optimisé pour pré-Alocaliser l'espace pour les listes qui se développent lorsqu'elles se développent lorsqu'elles se développent lorsqu'elles se développent lorsqu'elles se développent lorsqu'elles se développent lorsqu'elles grandissent Construit, sous cette forme. P>
Votre boucle vs le code réduite fait des choses complètement différentes
C'est fondamentalement parce que votre approche avec le
réduit code> et
+ code> est très loin d'optimal. Essayez
ithertools.chain.from_iterable () code> à la place.
L'original est une matrice numpue, ou plutôt un
pandas code> Dataframe. Donc
ordres2.values code> est une matrice numpue. à droite?
Le
np.concaténate code> que je suggère dans la question précédente est assez rapide.
C'est juste un tableau pas np.array
Il n'y a pas de "tableau juste" dans Python. Avez-vous vérifié le type
code>
docs.python.org/3/library/array.html#module- Array