Réponses:
La méthode numpy.show_config()
(ou numpy.__config__.show()
) génère des informations sur la liaison collectées au moment de la construction. Ma sortie ressemble à ceci. Je pense que cela signifie que j'utilise le BLAS / LAPACK fourni avec Mac OS.
>>> import numpy as np
>>> np.show_config()
lapack_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3']
define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
define_macros = [('NO_ATLAS_INFO', 3)]
lapack_opt_info
soit montré signifie que numpy est lié à lapack?
numpy.show_config()
, qui est probablement une fonction API publique en raison de l'absence de traits de soulignement de départ. Mais il n'est pas documenté en ligne et n'a pas de docstring, il n'est donc pas surprenant qu'il soit si difficile à trouver. J'espère qu'ils vont résoudre ce problème.
Voici ce que vous recherchez: informations système
J'ai compilé numpy / scipy avec atlas et je peux le vérifier avec:
import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')
Consultez la documentation pour plus de commandes.
sysinfo.get_info('atlas')
n'a rien retourné pour moi mais sysinfo.get_info('blas')
est revenu {'include_dirs': ['/usr/local/include', '/usr/include', '/opt/local/include', '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include'], 'libraries': ['blas', 'blas'], 'library_dirs': ['/usr/lib']}
et sysinfo.get_info('lapack')
est revenu {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']}
Qu'est-ce que cela signifie?
Comme il utilise les versions chargées dynamiquement, vous pouvez simplement faire ceci:
$ ldd anyoftheCmodules.so
où anyoftheCmodules.so
pourrait être, par exemple numpy/core/_dotblas.so
, vers quel lien libblas.so
.
numpy/core/_dotblas.so
? (voir le commentaire ci-dessous la réponse de talonmies)
.so
fichiers là-dedans. Recherchez simplement dans le répertoire NumPy (par exemple, en utilisant find /path/to/numpy -name "*.so"
). Quelques-uns d'entre eux ( _dotblas.so
, lapack_lite.so
sous celui précompilé d'Ubuntu, par exemple) utilisent BLAS / LAPACK
_dotblas.so
n'existe plus dans numpy v1.10 et plus récent , mais vous pouvez vérifier le lien de à la multiarray.so
place
numpy.__config__
objet canonique au moment de l'exécution. (Voir l'excellente réponse de davost .)
Vous pouvez utiliser l'outil de dépendance du chargeur de lien pour examiner les composants hook de niveau C de votre build et voir s'ils ont des dépendances externes sur votre blas et lapack de votre choix. Je ne suis pas près d'une boîte Linux pour le moment, mais sur une machine OS X, vous pouvez le faire dans le répertoire site-packages qui contient les installations:
$ otool -L numpy/core/_dotblas.so
numpy/core/_dotblas.so:
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
/System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 268.0.1)
$ otool -L scipy/linalg/flapack.so
scipy/linalg/flapack.so (architecture i386):
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
/System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/flapack.so (architecture ppc):
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
$ otool -L scipy/linalg/fblas.so
scipy/linalg/fblas.so (architecture i386):
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
/System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/fblas.so (architecture ppc):
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
remplacez ldd
- otool
le par un système gnu / Linux et vous devriez obtenir les réponses dont vous avez besoin.
numpy/core/_dotblas.so
? (voir le commentaire ci-dessous la réponse de Ricardos)
_dotblas.so
qui est le wrapper d'interface de tout ce qui a été utilisé pour construire la distribution. Sous Windows, il sera appelé _dotblas.pyd
, mais la fonction est la même.
_dotblas.so
ne soit construit que si vous utilisez une [atlas]
section dans site.cfg
(et une bibliothèque BLAS compatible CBLAS). Donc, vous devriez l'utiliser, même si vous n'utilisez pas ATLAS (sauf lorsque vous utilisez Intel MKL, qui a une section dédiée).
_dotblas.so
n'existe plus dans numpy v1.10 et plus récent , mais vous pouvez vérifier le lien de à la multiarray.so
place
Vous pouvez afficher la liaison BLAS, LAPACK, MKL en utilisant show_config()
:
import numpy as np
np.show_config()
Ce qui pour moi donne une sortie:
mkl_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['/my/environment/path/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/my/environment/path/include']
blas_mkl_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['/my/environment/path/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/my/environment/path/include']
blas_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['/my/environment/path/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/my/environment/path/include']
lapack_mkl_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['/my/environment/path/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/my/environment/path/include']
lapack_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['/my/environment/path/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/my/environment/path/include']
('HAVE_CBLAS', None)]
?
HAVE_CBLAS
est défini mais n'a aucune valeur (pensez à C :) #define HAVE_CBLAS
. Il n'a pas besoin de valeur car il n'est utilisé que comme indicateur. Je l'interpréterais comme HAVE_CBLAS=True
. Si vous n'aviez pas CBLAS, vous n'y auriez pas du tout le tuple.
Si vous avez installé anaconda-navigator (sur www.anaconda.com/anaconda/install/ pour linux, Windows ou macOS) - blas, scipy et numpy seront tous installés et vous pouvez les voir en cliquant sur l'onglet environnements sur le côté gauche de la page d'accueil du navigateur page (recherchez chaque répertoire dans l'ordre alpha). L'installation complète d'anaconda (par opposition à miniconda ou à des packages individuels) prendra en charge l'installation de nombreux packages essentiels nécessaires à la science des données.
numpy.__config__
devrait vraiment être une API publique. Néanmoins, vous gagnez ce tour, davost .