Comparaison de la vitesse de transposition de la matrice par Python

1. Origines

Je voulais obtenir un tableau bidimensionnel (matrice de translocation) avec les lignes et les colonnes permutées à partir d'un tableau bidimensionnel basé sur le type de liste standard Python, et ** parce que mon code était extrêmement lent **, quelle méthode de matrice de transposition Je me demandais si c'était le plus rapide, alors je l'ai comparé.

Transfer Matrix-Wikipedia

Étant donné que l'auteur est un débutant avec moins de six mois d'expérience en programmation, je vous serais reconnaissant si vous pouviez signaler des erreurs ou des méthodes d'amélioration. [** Pour accélérer le résultat de la comparaison **](résultat de la comparaison # 5 vitesses)

2. Environnement

name version
Python 3.7.4
Jupyter Notebook 6.0.1
NumPy 1.16.5
Pandas 0.25.1

3. Conditions

--Input est un tableau à deux dimensions avec le type de liste standard Python --Output est le type de liste standard Python, numpy.array ou pandas.DataFrame

3-1. Matrice de translocation

Le nom de la matrice à transposer est ʻin_matrix`, et cette fois une matrice 100x100 est générée.

Matrice à transloquer


#Matrice dans laquelle transférer_Créer une matrice
n = 100
m = 100
in_matrix = [[i for i in range(n)] for j in range(m)]

3-2. Mesure du temps de traitement

Ceci est fait en utilisant le % timeit du Jupyter Notebook (IPython). Built-in magic commands — %timeit
Le nombre de boucles est "-n 10000" et la répétition est "-r 10".

Mesure du temps de traitement


#Mesure du temps de traitement
%timeit -n 10000 -r 10 turn_matrix(in_matrix)

4. Méthode de translocation envisagée

--Transfert par double boucle [[turn_matrix1 ()](# 6-1-Transfert par double boucle 1), [turn_matrix2 ()](# 6-2-Transfert par double boucle 2)] --Transfert par la fonction intégrée zip () [[turn_matrix3 ()](# 6-3-Transfert par la fonction intégrée zip), [turn_matrix4 ()](# 6-4-Transfert par la notation d'inclusion de liste zip de la fonction intégrée) )]] --Transfert par NumPy [[turn_matrix5 ()](Transfert par # 6-5-numpy)] --Transfert par Pandas [[turn_matrix6 ()](Transfert par # 6-6-pandas)]

Parmi ce qui précède, la translocation à l'aide des fonctions intégrées zip (), NumPy et Pandas est basée sur les éléments suivants. Permuter les lignes et les colonnes d'un tableau bidimensionnel de type liste Python (translocation) | note.nkmk.me

5. Résultat de la comparaison de vitesse

En comparaison des vitesses de translocation, [Transfer by NumPy](Transfer by # 6-5-numpy) est ** extrêmement plus rapide (1,67 µs) **, suivi de [Transfer by Pandas](Transfer by # 6-6-pandas). ) (86,3 µs), [Fonction zip () + notation d'inclusion de liste](# 6-4-Transfert par notation d'inclusion de liste zip de fonction intégrée) (99,4 µs).

No. def description Vitesse de translocation
1 turn_matrix1() Double boucle 1 777 µs ± 43.6 µs
2 turn_matrix2() Double boucle 2 654 µs ± 83 µs
3 turn_matrix3() Zipdefonction() 105 µs ± 4.22 µs
4 turn_matrix4() Zipdefonction()+Notation d'inclusion de liste 99.4 µs ± 1.36 µs
5 turn_matrix5() NumPy 1.67 µs ± 38.9 ns
6 turn_matrix6() Pandas 86.3 µs ± 4.54 µs

sp.png

Cependant, dans [Transfer by NumPy](Transfer by # 6-5-numpy) et [Transfer by Pandas](Transfer by # 6-6-pandas), la conversion du type de liste en numpy.array est de ** 486 µs *. *, La conversion en pandas.DataFrame prend ** 6,19 ms , donc Le temps, y compris la conversion du type de liste, est [Transfer by NumPy](Transfer by # 6-5-numpy) ( 487.67 µs ), [Transfer by Pandas](Transfer by # 6-6-pandas) Il est devenu ( 6,2763 ms **). Par conséquent, si la matrice donnée est de type liste, le temps de traitement total pour obtenir la matrice transposée à partir de la matrice de type liste est ** [fonction zip () + notation d'inclusion de liste](# 6-4-fonction intégrée zip). (Transfert par notation d'inclusion de liste) (99,4 µs) ** a été considéré comme le plus rapide.

No. def description Vitesse de translocation np.array ou pd.Conversion vers DataFrame
1 turn_matrix1() Double boucle 1 777 µs ± 43.6 µs
2 turn_matrix2() Double boucle 2 654 µs ± 83 µs
3 turn_matrix3() Zipdefonction() 105 µs ± 4.22 µs
4 turn_matrix4() Zipdefonction()+Notation d'inclusion de liste 99.4 µs ± 1.36 µs
5 turn_matrix5() NumPy 1.67 µs ± 38.9 ns 486 µs ± 10.1 µs
6 turn_matrix6() Pandas 86.3 µs ± 4.54 µs 6.19 ms ± 43.1 µs

sp2.png

6. Fonction de translocation

6-1. Inversion par double boucle 1

Nom de la fonction: turn_matrix1 () Translocation par double boucle créée sans aucune référence. Passez le nombre de lignes x et le nombre de colonnes y de l'argument «matrice» à la boucle for, et extrayez de l'argument «matrice» avec le nombre de lignes comme nombre de colonnes et le nombre de colonnes comme nombre de lignes.

Inversion par double boucle 1


#Matrice dans laquelle transférer_Créer une matrice
n = 100
m = 100
in_matrix = [[i for i in range(n)] for j in range(m)]

#Rotation de la fonction de translocation_matrix1()
def turn_matrix1(matrix):
    x = len(matrix)
    y = len(matrix[0])    
    turned = []
    for i in range(y):
        tmp = []
        for j in range(x):
            tmp.append(matrix[j][i])
        turned.append(tmp)
    return turned

#Mesure du temps de traitement
%timeit -r 10 -n 10000 turn_matrix1(in_matrix)

** Résultat d'exécution ** 777 µs ± 43.6 µs per loop (mean ± std. dev. of 10 runs, 10000 loops each)

6-2. Inversion par double boucle 2

Nom de la fonction: turn_matrix2 () Dans [6-1. Translocation 1 par double boucle](# 6-1-Transfert 1 par double boucle), le nombre de lignes x et le nombre de colonnes y de l'argument matrice ont été acquis, mais l'argument matrice De, sortez ligne par ligne avec une boucle for, créez une ligne tmp avec la même valeur de numéro de colonne, et ajoutez-la à turn.

Inversion par double boucle 2


#Matrice dans laquelle transférer_Créer une matrice
n = 100
m = 100
in_matrix = [[i for i in range(n)] for j in range(m)]

#Rotation de la fonction de translocation_matrix2()
def turn_matrix2(matrix):
    y = len(matrix[0])
    turned = []
    for i in range(y):
        tmp = []
        for j in matrix:
            tmp.append(j[i])
        turned.append(tmp)
    return turned

#Mesure du temps de traitement
%timeit -r 10 -n 10000 turn_matrix2(in_matrix)

** Résultat d'exécution ** 654 µs ± 83 µs per loop (mean ± std. dev. of 10 runs, 10000 loops each)

6-3. Translocation par la fonction intégrée zip ()

Nom de la fonction: turn_matrix3 ()

Zip de fonction intégré()Déménagement par


#Matrice dans laquelle transférer_Créer une matrice
n = 100
m = 100
in_matrix = [[i for i in range(n)] for j in range(m)]

#Rotation de la fonction de translocation_matrix3(matrix)
def turn_matrix3(matrix):
    turned = []
    for i in zip(*matrix):
        turned.append(list(i))
    return turned

#Mesure du temps de traitement
%timeit -r 10 -n 10000 turn_matrix3(in_matrix)

** Résultat d'exécution ** 105 µs ± 4.22 µs per loop (mean ± std. dev. of 10 runs, 10000 loops each)

6-4. Fonction intégrée zip () + translocation par notation d'inclusion de liste

Nom de la fonction: turn_matrix4 ()

Zip de fonction intégré()+Inversion par notation d'inclusion de liste


#Matrice dans laquelle transférer_Créer une matrice
n = 100
m = 100
in_matrix = [[i for i in range(n)] for j in range(m)]

#Rotation de la fonction de translocation_matrix4()
def turn_matrix4(matrix):
    return [list(x) for x in zip(*matrix)]

#Mesure du temps de traitement
%timeit -r 10 -n 10000 turn_matrix3(in_matrix)

** Résultat d'exécution ** 99.4 µs ± 1.36 µs per loop (mean ± std. dev. of 10 runs, 10000 loops each)

Notation d'inclusion de liste


turned_matrix = [list(x) for x in zip(*in_matrix)] 

Permuter les lignes et les colonnes d'un tableau bidimensionnel de type liste Python (translocation) | note.nkmk.me

6-5. Translocation par NumPy

Nom de la fonction: turn_matrix5 ()

Translocation par NumPy


import numpy as np

#Matrice dans laquelle transférer_Créer une matrice
n = 100
m = 100
in_matrix = [[i for i in range(n)] for j in range(m)]

#in_numpy de matrice.tableau numpy_in_Créer une matrice
%timeit numpy_in_matrix = np.array(in_matrix)

#Rotation de la fonction de translocation_matrix5()
def turn_matrix5(matrix):
    return matrix.T

#Mesure du temps de traitement
%timeit -r 10 -n 10000 turn_matrix5(numpy_in_matrix)

** Résultat d'exécution ** Conversion de in_matrix en numpy.array 486 µs ± 10.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Translocation 1.67 µs ± 38.9 ns per loop (mean ± std. dev. of 10 runs, 10000 loops each)

Translocation par NumPy


import numpy as np

turned_matrix = np.array(in_matrix).T

Permuter les lignes et les colonnes d'un tableau bidimensionnel de type liste Python (translocation) | note.nkmk.me

6-6. Réinstallation par les pandas

Nom de la fonction: turn_matrix6 ()

Translocation par les pandas


import pandas as pd

#Matrice dans laquelle transférer_Créer une matrice
n = 100
m = 100
in_matrix = [[i for i in range(n)] for j in range(m)]

#in_pandas de la matrice.Pandas DataFrame_in_Créer une matrice
%timeit pandas_in_matrix = pd.DataFrame(in_matrix)

#Rotation de la fonction de translocation_matrix6()
def turn_matrix5(matrix):
    return matrix.T

#Mesure du temps de traitement
%timeit -r 10 -n 10000 turn_matrix5(pandas_in_matrix)

** Résultat d'exécution ** -Conversion de in_matrix à pandas.DataFrame 6.19 ms ± 43.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

· Transfert 86.3 µs ± 4.54 µs per loop (mean ± std. dev. of 10 runs, 10000 loops each)

Translocation par les pandas


import pandas as pd

turned_matrix = pd.DataFrame(in_matrix).T

Permuter les lignes et les colonnes d'un tableau bidimensionnel de type liste Python (translocation) | note.nkmk.me

Recommended Posts

Comparaison de la vitesse de transposition de la matrice par Python
Comparaison des performances du détecteur de visage avec Python + OpenCV
Comparaison de 4 types de frameworks Web Python
Comparaison de CoffeeScript avec la grammaire JavaScript, Python et Ruby
Premiers pas avec Python Bases de Python
Jeu de vie avec Python! (Le jeu de la vie de Conway)
Implémentation de la méthode Dyxtra par python
Comparaison de la vitesse de la perspective XML Python
Coexistence de Python2 et 3 avec CircleCI (1.0)
Etude de base d'OpenCV avec Python
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
Bases du traitement d'images binarisées par Python
[Exemple d'amélioration de Python] Apprentissage de Python avec Codecademy
Exécuter le script Python avec TS-220 cron
Comparaison des modules de conversion japonais en Python3
Vérifier l'existence du fichier avec python
Obstrué par la mise à jour Python de la console GCP ①
Introduction facile de la reconnaissance vocale avec Python
comparaison de chaînes python / utiliser 'list' et 'in' au lieu de '==' et 'ou'
[EDA] Introduction de Sweetviz (comparaison avec + pandas-profiling)
Classe Trump en Python (avec comparaison)
Apprendre Python! Comparaison avec Java (fonction de base)
UnicodeEncodeError lutte avec la sortie standard de python3
Créer un fichier Excel avec Python + matrice de similarité
1. Statistiques apprises avec Python 1-3. Calcul de diverses statistiques (statistiques)
Dessin avec Matrix-Reinventor of Python Image Processing-
Recommandation d'Altair! Visualisation des données avec Python
Comparaison des frameworks sans serveur Python-Zappa vs Chalice
Filtrage par convolution par matrice-Reinventor of Python image processing-
[AtCoder] Résoudre un problème de ABC101 ~ 169 avec Python
J'ai essayé des centaines de millions de SQLite avec python
FizzBuzz en Python3
Grattage avec Python
Résumé de la comparaison des bibliothèques pour générer des PDF avec Python
Préparer l'environnement d'exécution de Python3 avec Docker
Premier Python 3 ~ Première comparaison ~
Statistiques avec python
Fonctionnement automatique de Chrome avec Python + Sélénium + pandas
[Python] axe limite du graphe 3D avec Matplotlib
Mathématiques Todai 2016 résolues avec Python
Grattage avec Python
Python avec Go
[Note] Exportez le html du site avec python.
Obstruction de la mise à jour python de la console GCP ② (Solution)
[Python3] Comparaison de vitesse, etc. sur la privation de numpy.ndarray
[Python] Rotation à droite de 90 degrés, rotation à gauche de 90 degrés, rotation de la matrice à 180 degrés [AtCoder]
Calculez le nombre total de combinaisons avec python
Twilio avec Python
Intégrer avec Python
Utiliser plusieurs versions de l'environnement python avec pyenv
Vérifiez la date du devoir de drapeau avec Python
Jouez avec 2016-Python
Résolvez A ~ D du codeur yuki 247 avec python
AES256 avec python
Testé avec Python
Les bases de Python ①
1. Statistiques apprises avec Python 1-2. Calcul de diverses statistiques (Numpy)