Numba pour accélérer en Python

J'utilise un peu Cython, mais parfois je trouve cela ennuyeux (par exemple, j'ai besoin de setup.py à grande échelle), et j'ai découvert Numba, ce qui facilite l'accélération de Python. N'est-il pas agréable de JIT avec llvm comme Julia? Je l'ai également essayé en référence à l'article suivant. Si vous êtes nouveau sur Numba lui-même, veuillez d'abord consulter le lien.

Pour l'instant, il ne s'agit que de la façon de le mettre en œuvre.

Comment installer

Pour Mac 10.9 avec Python 2.7

Cela a fonctionné ci-dessous.

sudo easy_install funcsigs enum34 numba

git clone https://github.com/numba/llvmlite
cd llvmlite/
sudo python setup.py install

Veuillez noter ce qui suit.

--llvmlite peut être entré avec easy_install, mais dylib ne suffit pas et une erreur d'exécution (pourquoi?) --En plus de enum34, enum peut être facilement_installé, mais cela provoque une erreur. --Lorsque je l'ai essayé sur Mac OS 10.9, qui est différent de la machine que j'ai essayée en premier, j'ai eu une erreur avec import numba, mais cela a été résolu en réinstallant numpy. Je viens de le construire à partir de github avec la commande suivante sans trop réfléchir ...

```
git clone https://github.com/numpy/numpy.git numpy_temp
cd numpy_temp
python setupegg.py bdist_egg
sudo easy_install dist/*egg
```

Pour Windows7 64 bits Python 2.7

~~ Je vais bientôt défier Windows7 avec WinPython2.7, mais je pense que llvm est nécessaire, le support C ++ 11 est probablement nécessaire, 64bit semble être difficile, et il y a beaucoup de murs ... ~~ Anaconda Je l'ai mis et il est passé. Anaconda Je l'ai utilisé pour la première fois, mais si vous avez la possibilité de ronger les calculs numériques ou si vous souhaitez accélérer votre code Python, il semble bon de l'utiliser de manière positive.

Utilisation et impression

J'ajouterai cela plus tard, mais j'oserai l'essayer avec un procédé autre que le calcul numérique. La raison en est que l'effet sur le calcul numérique a déjà été évalué par le prédécesseur mentionné ci-dessus, et il se trouve que je suis en train de faire un programme compliqué de lecture / écriture de données binaires au lieu d'un calcul numérique.

À utiliser avec PyInstaller

L'utilisation de PyInstaller rend les scripts Python exécutables et facilite leur distribution à d'autres, mais ceux qui utilisent numba donneront l'erreur suivante lors de l'exécution. En effet, PyInstaller ne parvient pas à collecter les fichiers que Python ouvre dynamiquement.

OSError: dlopen(/var/folders/qk/z4x58g2962q21q5570g2hj0c0000gn/T/_MEIRXXAjg/llvmlite/binding/libllvmlite.dylib, 6): image not found

Alors incluons ce dylib dans le résultat de la construction. Vous pouvez contourner le problème en suivant les étapes ci-dessous. PyInstaller utilise la balise github v2.1.

Pour Mac

  1. python pyinstaller / pyinstaller.py --onefile test.py. À ce stade, test.spec est créé et en même temps un exe est créé sur la base de ce test.spec, mais cet exe est dans l'état d'erreur ci-dessus.

  2. Ajoutez la ligne suivante à test.spec et indiquez-lui d'incorporer libllvmlite.dylib dans l'exécutable onefiled.

    # -*- mode: python -*-
    a = Analysis(['test.py'],
                 pathex=['/path/to/main/script'],
                 hiddenimports=[],
                 hookspath=None,
                 runtime_hooks=None)
    
    #Une ligne en dessous est ajoutée
    a.binaries += [("llvmlite/binding/libllvmlite.dylib", "/Library/Python/2.7/site-packages/llvmlite/binding/libllvmlite.dylib", 'BINARY')]
    
    pyz = PYZ(a.pure)
    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              name='test',
              debug=False,
              strip=None,
              upx=True,
              console=True )
    
  3. Définissez python pyinstaller / pyinstaller.py --clean test.spec et reconstruisez avec le test.spec modifié.

Pour Windows Anaconda

(En supposant que vous avez installé l'environnement dans C: \ Anaconda) Tout d'abord, lorsque vous essayez d'utiliser l'environnement Anaconda avec PyInstaller, vous rencontrerez une erreur indiquant que pywintypes est introuvable quel que soit Numba. Cependant, j'ai pu le résoudre en plaçant la dll à l'emplacement trouvé dans PyInstaller dans Méthode décrite ici.

cd C:\Anaconda\Lib\site-packages\win32\
copy pywintypes27.dll lib\
copy pythoncom27.dll lib\

Après cela, écrivez simplement la méthode d'approvisionnement de llvmlite.dll dans .spec comme dans le cas de Mac. Si vous l'avez installé dans C: \ Anaconda, la ligne que vous devez ajouter devrait ressembler à ceci:

a.binaries += [("llvmlite/binding/llvmlite.dll", "C:\\Anaconda\\Lib\\site-packages\\llvmlite\\binding\\llvmlite.dll", 'BINARY')]

Recommended Posts

Numba pour accélérer en Python
Accélérez grossièrement Python avec numba
Comment accélérer les calculs Python
[Python] Faites de votre mieux pour accélérer SQL Alchemy
Projet Euler 4 Tentative d'accélération
[DRF] Extrait pour accélérer PrimaryKeyRelatedField
N'écrivez pas Python si vous voulez l'accélérer avec Python
[Python] Hit Keras depuis TensorFlow et TensorFlow depuis c ++ pour accélérer l'exécution.
Indispensable si vous utilisez Python! Comment utiliser Numpy pour accélérer les calculs!
Comment accélérer la belle instanciation de soupe
Mis à jour vers Python 2.7.9
"Backport" vers python 2
Modèle d'extension Python C / C ++ - Passez des données à Python en tant que np.array
Comment accélérer Scicit-Learn comme Conda Numpy
Vitesse: ajouter un élément à la fin du tableau Python
Comment générer "Ketsumaimo" en standard en Python
Appelez Rust de Python pour accélérer! Tutoriel PyO3: Partie des classes d'habillage ➀
Organiser les outils Python pour accélérer le mouvement initial des compétitions d'analyse de données
Appelez Rust de Python pour accélérer! Tutoriel PyO3: partie des classes d'emballage ➁
Le programme Python est lent! Je veux accélérer! Dans ce cas ...
De la configuration du Raspberry Pi à l'installation de l'environnement Python
Essais et erreurs pour accélérer la génération de cartes thermiques
Essai et erreur pour accélérer les captures d'écran Android
Comment installer Python
Comment configurer un environnement Python à l'aide de pyenv
Python ~ Apprentissage rapide de la grammaire ~
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Vitesse de notation d'inclusion de liste en Python
Réécrire le code Python2 en Python3 (2to3)
Comment installer python
Introduction au langage Python
Tous jusqu'à 775/664, 777/666, 755/644, etc.
Introduction à OpenCV (python) - (2)
Remarque pour faire de python un démon
Introduction de Python 2.7 à CentOS 6.6
Spécifiez MinGW comme compilateur utilisé dans Python
Examen de atcoder ABC158, jusqu'à la question E (Python)
Remarques sur l'accélération du code Python avec Numba
Temps de multiplication à plusieurs chiffres jusqu'à 300 millions de chiffres en python
[Introduction à Udemy Python3 + Application] 68. Instruction d'importation et AS
Connectez python à mysql
Appelez Rust de Python pour accélérer! Tutoriel PyO3: Emballage d'une partie de fonction simple
Appelez Rust de Python pour accélérer! Tutoriel PyO3: Emballage d'une partie de fonction simple ➁
Publié en tant que pièce jointe à Slack sur AWS Lambda (Python)
Un script qui compte jusqu'à 5 secondes et s'arrête dans le Python de Blender
Ce que j'ai fait pour accélérer la tâche de recherche de chaînes
Examen du concours AtCoder pour débutants 159, jusqu'à la question E (Python)
Comment importer la bibliothèque Python configurée dans EFS dans Lambda
Examen du concours AtCoder Beginner Contest 163, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 164, jusqu'à la question E (Python)
J'ai essayé d'accélérer la création vidéo en traitant en parallèle
Examen du concours AtCoder Beginner Contest 162, jusqu'à la question E (Python)
[Python] Comment définir des noms de variables dynamiquement et comparer la vitesse
[Python Kivy] Comment créer une simple fenêtre pop-up
Examen du concours AtCoder Beginner Contest 154, jusqu'à la question E (Python)
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python