[PYTHON] Je pensais qu'il serait lent d'utiliser l'instruction for dans NumPy, mais ce n'était pas le cas.

Inspiré par L'écriture explicite d'une boucle avec numpy est extrêmement lente

Dans l'article ci-dessus, il a été dit qu'écrire explicitement serait extrêmement lent. Par exemple

def matmul1(a, b):
    lenI = a.shape[0]
    lenJ = a.shape[1]
    lenK = b.shape[1]
    c = np.zeros((lenI, lenJ))
    for i in range(lenI):
        for j in range(lenJ):
            for k in range(lenK):
                c[i, j] += a[i, k] * b[k, j]
    return c

Le code comme est plus lent que np.dot.

%timeit matmul1(a, b)
1 loops, best of 3: 12.9 s per loop
%timeit np.dot(a, b)
10 loops, best of 3: 20.7 ms per loop

C'est lent car il est calculé sur mon ordinateur portable. De plus, atlas / mkl n'est pas lié.

Utilisez maintenant Numba.

import numba

@numba.jit  #Ajouter seulement ici
def matmul1_jit(a, b):
    lenI = a.shape[0]
    lenJ = a.shape[1]
    lenK = b.shape[1]
    c = np.zeros((lenI, lenJ))
    for i in range(lenI):
        for j in range(lenJ):
            for k in range(lenK):
                c[i, j] += a[i, k] * b[k, j]
    return c

Il s'agit d'une compilation JIT de code Python utilisant LLVM, donc elle peut s'exécuter très rapidement. Le premier appel comprend le temps de compilation, donc si vous mesurez la vitesse sur les appels suivants:

%timeit matmul1_jit(a, b)
10 loops, best of 3: 24.4 ms per loop

Le simple fait d'ajouter une ligne comme celle-ci le rendait à peu près identique à np.dot (environ 20% plus lent).

Placez le [ipynb] entier (http://nbviewer.ipython.org/gist/termoshtt/824ff3e766de5fe9fdd6) dans gist. J'aimerais pouvoir intégrer nbviewer dans Qiita.

Recommended Posts

Je pensais qu'il serait lent d'utiliser l'instruction for dans NumPy, mais ce n'était pas le cas.
Pour la première fois dans Numpy, je vais le mettre à jour de temps en temps
Pratique pour utiliser les sous-graphiques matplotlib dans l'instruction for
Je ne savais pas comment utiliser l'instruction [python] for
L'utilisation du japonais pour les noms de dossier et les noms de bloc-notes dans Databricks peut poser problème
Je souhaite spécifier un fichier qui n'est pas une certaine chaîne de caractères comme cible logrotate, mais est-ce impossible?
Si vous voulez être guéri par l'image de Mia Nanasawa, appuyez sur l'API Twitter ♪
Je veux utiliser quatre règles compliquées dans l'instruction IF du modèle Django! → Utilisez un modèle personnalisé
Même si je savais que le cours d'apprentissage automatique de l'exemple était bon, j'ai continué à le suivre pendant deux ans, mais c'était quand même bon
J'ai essayé d'utiliser eval (a, b) pour Fibonacci, mais ce n'était pas rapide
Je voulais utiliser le module de recherche d'Ansible2, mais cela a pris du temps, alors prenez note
Comment enregistrer les informations de point caractéristique de l'image dans un fichier et l'utiliser pour la mise en correspondance
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
J'ai recherché les compétences nécessaires pour devenir ingénieur web avec Python
Le programme Python est lent! Je veux accélérer! Dans ce cas ...
[Python] Je souhaite utiliser uniquement l'index lors de la mise en boucle d'une liste avec une instruction for
J'ai essayé de gratter YouTube, mais je peux utiliser l'API, alors ne le faites pas.
J'essaierai de résumer les liens qui me semblent utiles pour le moment
Ce serait sage si vous pouviez écrire quelque chose comme booléen et "A" ou "B" [Python] [Mais]
J'ai essayé de faire une application mémo qui peut être pomodoro, mais un enregistrement de réflexion
Je me suis rendu compte qu'il était absurde de l'utiliser sans réfléchir car le module est pratique
En ce qui concerne le type de processus écrit dans le fichier Procfile de honcho, j'y ai été accro pendant plus d'une heure parce que je ne pouvais pas utiliser -, donc je l'écrirai comme une émission.
Lorsque vous voulez plt.save dans l'instruction for
Je veux utiliser le jeu de données R avec python
[C / C ++] Passez la valeur calculée en C / C ++ à une fonction python pour exécuter le processus et utilisez cette valeur en C / C ++.
Est-ce un problème d'éliminer le besoin de ressources humaines analogiques à l'ère de l'IA?
[Partie 1] J'ai essayé de résoudre l'erreur "Avertissement utilisateur: une entrée n'a pas pu être récupérée. Cela pourrait être parce qu'un travailleur est mort" qui s'est produite dans le masque R-CNN.
[Partie 2] J'ai essayé de résoudre l'erreur "Avertissement utilisateur: une entrée n'a pas pu être récupérée. Cela pourrait être parce qu'un travailleur est décédé" qui s'est produite dans le masque R-CNN.
Je veux absorber la différence entre l'instruction for sur la matrice Python + numpy et l'instruction Julia for
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
Création d'un outil qui facilite la définition des paramètres des modèles d'apprentissage automatique
Comment utiliser la méthode __call__ dans la classe Python
Utilisez MeCab pour traduire des phrases bâclées de manière "lente".
Comment définir plusieurs variables dans une instruction Python for
Je l'ai écrit en langage Go pour comprendre le principe SOLID
Je veux créer un Dockerfile pour le moment.
J'ai écrit un script qui divise l'image en deux
J'ai essayé de créer un site qui permet de voir facilement les informations mises à jour d'Azure
J'ai essayé de l'étendre pour que la base de données puisse être utilisée avec le logiciel d'analyse de Wiire
J'ai entendu des rumeurs selon lesquelles malloc est lent et devrait être stocké en mémoire, alors je l'ai comparé.
J'ai créé une fonction pour vérifier si le webhook est reçu dans Lambda pour le moment
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
[Python] Comment utiliser l'instruction for. Une méthode d'extraction en spécifiant une plage ou des conditions.
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Faisons-le en divisant numpy sans utiliser l'instruction for
J'ai créé un programme qui résout la recherche d'erreur en quelques secondes
[Selenium] Utilisez l'instruction while pour passer à plusieurs reprises à la "page suivante"
Un minuteur (ticker) qui peut être utilisé sur le terrain (peut être utilisé n'importe où)
Je veux créer un fichier pip et le refléter dans le menu fixe
Faisons-le en multipliant numpy sans utiliser l'instruction for
J'ai fait une commande pour afficher un calendrier coloré dans le terminal
J'ai écrit un tri-arbre qui peut être utilisé pour l'implémentation de dictionnaire à grande vitesse en langage D et Python
[Pour les débutants] Je veux obtenir l'index d'un élément qui satisfait une certaine expression conditionnelle
J'ai essayé de créer un système pour acquérir automatiquement le guide des programmes → l'enregistrer dans le calendrier en un jour
Solution au problème que Ctrl + z ne peut pas être utilisé dans Powershell dans l'environnement Docker pour Windows (provisoire)
Pour le moment en utilisant FastAPI, je veux montrer comment utiliser l'API comme ça dans swagger
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
J'ai créé une application pour les étrangers visitant le Japon à Hackason et j'ai gagné un prix, mais quand j'y réfléchissais attentivement, c'était inutile