Speed up qiskit import by not using pip in version.py (#3158)

* Speed up qiskit import by not using pip in version.py

This commit speeds up the import time of qiskit by removing the pip call
at run time. This call was overkill and slow, since all we really needed
it for was to get the installed versions of the qiskit meta package. We
were also using as a fallback if element.__version__ failed, but that
was potentially misleading. This commit replaces the pip subprocess call
with the pkg_resources stdlib module to query if the metapackage is
installed and if so to grab that version. This is always faster than
subprocess to call pip freeze. That being said the performace at import
will vary based on the number of installed python packages because it
still has to check all the installed packages.

* Fix lint

* Fix default for metapackage
This commit is contained in:
Matthew Treinish 2019-09-27 10:05:28 -04:00 committed by Kevin Krsulich
parent cab185b571
commit 5c5a1d04b0
1 changed files with 8 additions and 40 deletions

View File

@ -18,9 +18,7 @@
import os
import subprocess
import sys
import warnings
import pkg_resources
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
@ -92,57 +90,27 @@ def _get_qiskit_versions():
from qiskit.providers import aer
out_dict['qiskit-aer'] = aer.__version__
except Exception:
pass
out_dict['qiskit-aer'] = None
try:
from qiskit import ignis
out_dict['qiskit-ignis'] = ignis.__version__
except Exception:
pass
out_dict['qiskit-ignis'] = None
try:
from qiskit.providers import ibmq
out_dict['qiskit-ibmq-provider'] = ibmq.__version__
except Exception:
pass
out_dict['qiskit-ibmq-provider'] = None
try:
from qiskit import aqua
out_dict['qiskit-aqua'] = aqua.__version__
except Exception:
pass
cmd = [sys.executable, '-m', 'pip', 'freeze']
out_dict['qiskit-aqua'] = None
try:
reqs = _minimal_ext_cmd(cmd)
except Exception as exc:
warnings.warn(str(exc))
return out_dict
reqs_dict = {}
for req in reqs.split():
req_parts = req.decode().split('==')
if len(req_parts) == 1 and req_parts[0].startswith('git'):
if 'qiskit' in req_parts[0]:
package = req_parts[0].split('#egg=')[1]
sha = req_parts[0].split('@')[-1].split('#')[0]
reqs_dict[package] = 'dev-' + sha
continue
elif len(req_parts) == 1:
continue
reqs_dict[req_parts[0]] = req_parts[1]
# Dev/Egg _ to - conversion
for package in ['qiskit_terra', 'qiskit_ignis', 'qiskit_aer',
'qiskit_ibmq_provider', 'qiskit_aqua']:
if package in reqs_dict:
if package.replace('_', '-') in out_dict:
continue
out_dict[package.replace('_', '-')] = reqs_dict[package]
out_dict['qiskit'] = pkg_resources.get_distribution('qiskit').version
except Exception:
out_dict['qiskit'] = None
for package in ['qiskit', 'qiskit-terra', 'qiskit-ignis', 'qiskit-aer',
'qiskit-ibmq-provider', 'qiskit-aqua']:
if package in out_dict:
continue
if package in reqs_dict:
out_dict[package] = reqs_dict[package]
else:
out_dict[package] = None
return out_dict