Hello community,
here is the log from the commit of package python-numexpr for
openSUSE:Leap:15.2 checked in at 2020-03-09 18:09:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-numexpr (Old)
and /work/SRC/openSUSE:Leap:15.2/.python-numexpr.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-numexpr"
Mon Mar 9 18:09:32 2020 rev:11 rq:776859 version:2.7.1
Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/python-numexpr/python-numexpr.changes
2020-01-15 15:50:52.463509555 +0100
+++
/work/SRC/openSUSE:Leap:15.2/.python-numexpr.new.26092/python-numexpr.changes
2020-03-09 18:09:33.249040789 +0100
@@ -1,0 +2,74 @@
+Wed Jan 8 18:04:17 UTC 2020 - Todd R <[email protected]>
+
+- Update to 2.7.1
+ * Python 3.8 support has been added.
+ * Python 3.4 support is discontinued.
+ * The tests are now compatible with NumPy 1.18.
+ * site.cfg.example was updated to use the libraries tag instead
+ of mkl_libs, which is recommended for newer version of NumPy.
+- Drop upstream-included fix_test.patch
+
+-------------------------------------------------------------------
+Sat Aug 31 04:46:34 UTC 2019 - Arun Persaud <[email protected]>
+
+- specfile:
+ * update copyright year
+ * added fix to call python in tests: fix_test.patch
+
+- update to version 2.7.0:
+ * The default number of 'safe' threads has been restored to the
+ historical limit of 8, if the environment variable
+ "NUMEXPR_MAX_THREADS" has not been set.
+ * Thanks to @eltoder who fixed a small memory leak.
+ * Support for Python 2.6 has been dropped, as it is no longer
+ available via TravisCI.
+ * A typo in the test suite that had a less than rather than greater
+ than symbol in the NumPy version check has been corrected thanks
+ to dhomeier.
+ * The file site.cfg was being accidently included in the sdists on
+ PyPi. It has now been excluded.
+
+-------------------------------------------------------------------
+Sat Dec 22 05:26:03 UTC 2018 - Todd R <[email protected]>
+
+- Update to 2.6.9
+ * Thanks to Mike Toews for more robust handling of the thread-setting
environment variables.
+ * With Appveyor updating to Python 3.7.1, wheels for Python 3.7 are now
available in addition to those for other OSes.
+
+-------------------------------------------------------------------
+Sun Sep 2 16:48:00 UTC 2018 - [email protected]
+
+- update to version 2.6.8:
+ * Add check to make sure that f_locals is not actually f_globals
+ when we do the f_locals clear to avoid the #310 memory leak issue.
+ * Compare NumPy versions using distutils.version.LooseVersion to
+ avoid issue #312 when working with NumPy development versions.
+ * As part of multibuild, wheels for Python 3.7 for Linux and MacOSX
+ are now available on PyPI.
+
+- changes from version 2.6.7:
+ * Thanks to Lehman Garrison for finding and fixing a bug that
+ exhibited memory leak-like behavior. The use in numexpr.evaluate
+ of sys._getframe combined with .f_locals from that frame object
+ results an extra refcount on objects in the frame that calls
+ numexpr.evaluate, and not evaluate's frame. So if the calling
+ frame remains in scope for a long time (such as a procedural
+ script where numexpr is called from the base frame) garbage
+ collection would never occur.
+ * Imports for the numexpr.test submodule were made lazy in the
+ numexpr module.
+
+-------------------------------------------------------------------
+Mon Aug 6 20:04:09 UTC 2018 - [email protected]
+
+- Update to 2.6.6
+ * Thanks to Mark Dickinson for a fix to the thread barrier that
occassionally suffered from spurious wakeups on MacOSX.
+- Update to 2.6.5
+ * The maximum thread count can now be set at import-time by setting the
environment variable ‘NUMEXPR_MAX_THREADS’. The default number of max threads
was lowered from 4096 (which was deemed excessive) to 64.
+ * A number of imports were removed (pkg_resources) or made lazy (cpuinfo) in
order to speed load-times for downstream packages (such as pandas, sympy, and
tables). Import time has dropped from about 330 ms to 90 ms. Thanks to Jason
Sachs for pointing out the source of the slow-down.
+ * Thanks to Alvaro Lopez Ortega for updates to benchmarks to be compatible
with Python 3.
+ * Travis and AppVeyor now fail if the test module fails or errors.
+ * Thanks to Mahdi Ben Jelloul for a patch that removed a bug where constants
in where calls would raise a ValueError.
+ * Fixed a bug whereby all-constant power operations would lead to infinite
recursion.
+
+-------------------------------------------------------------------
Old:
----
numexpr-2.6.4.tar.gz
New:
----
numexpr-2.7.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-numexpr.spec ++++++
--- /var/tmp/diff_new_pack.TInYOq/_old 2020-03-09 18:09:33.529041190 +0100
+++ /var/tmp/diff_new_pack.TInYOq/_new 2020-03-09 18:09:33.529041190 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-numexpr
#
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,20 +12,19 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-numexpr
-Version: 2.6.4
+Version: 2.7.1
Release: 0
-Url: https://github.com/pydata/numexpr/
Summary: Numerical expression evaluator for NumPy
License: MIT
Group: Development/Languages/Python
+URL: https://github.com/pydata/numexpr/
Source:
https://files.pythonhosted.org/packages/source/n/numexpr/numexpr-%{version}.tar.gz
-BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: %{python_module devel}
BuildRequires: %{python_module numpy-devel >= 1.6}
BuildRequires: %{python_module setuptools}
@@ -43,6 +42,8 @@
%prep
%setup -q -n numexpr-%{version}
+# wrong-file-end-of-line-encoding
+sed -i 's/\r$//' ANNOUNCE.rst AUTHORS.txt README.rst RELEASE_NOTES.rst
site.cfg.example
# remove unwanted shebang
sed -i '/^#!/ d' numexpr/cpuinfo.py
@@ -54,9 +55,17 @@
%python_install
%python_expand %fdupes %{buildroot}%{$python_sitearch}
+%check
+mkdir tester
+pushd tester
+%{python_expand export PYTHONPATH=%{buildroot}%{$python_sitearch}
+$python -B -c "import sys;import numexpr;sys.exit(0 if
numexpr.test().wasSuccessful() else 1)"
+}
+popd
+
%files %{python_files}
-%defattr(-,root,root,-)
-%doc ANNOUNCE.rst AUTHORS.txt LICENSE.txt README.rst RELEASE_NOTES.rst
site.cfg.example
+%doc ANNOUNCE.rst AUTHORS.txt README.rst RELEASE_NOTES.rst site.cfg.example
+%license LICENSE.txt
%{python_sitearch}/numexpr/
%{python_sitearch}/numexpr-%{version}-py*.egg-info
++++++ numexpr-2.6.4.tar.gz -> numexpr-2.7.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/ANNOUNCE.rst
new/numexpr-2.7.1/ANNOUNCE.rst
--- old/numexpr-2.6.4/ANNOUNCE.rst 2017-09-14 08:44:35.000000000 +0200
+++ new/numexpr-2.7.1/ANNOUNCE.rst 2020-01-03 18:27:17.000000000 +0100
@@ -1,42 +1,24 @@
+=========================
+ Announcing Numexpr 2.7.1
+=========================
+
Hi everyone,
-This is primarily a maintenance release that fixes a number of newly discovered
-bugs. The NumPy requirement has increased from 1.6 to 1.7 due to changes with
-`numpy.nditer` flags. Thanks to Caleb P. Burns `ceil` and `floor` functions
are
-now supported.
+This is a version bump to add support for Python 3.8 and NumPy 1.18. We are
also
+removing support for Python 3.4.
-Project documentation is now available at:
+Project documentation is available at:
http://numexpr.readthedocs.io/
-P.S. due to seg-faults occuring for MKL with ceil and floor we have pushed a
-quick patch for 2.6.3 to 2.6.4. Thanks to Christoph Gohkle for the fixes.
+Changes from 2.7.0 to 2.7.1
+----------------------------
-==========================
- Announcing Numexpr 2.6.4
-==========================
-
-Changes from 2.6.3 to 2.6.4
----------------------------
-
-- Christoph Gohkle noticed a lack of coverage for the 2.6.3
- `floor` and `ceil` functions for MKL that caused seg-faults in
- test, so thanks to him for that.
-
-Changes from 2.6.2 to 2.6.3
----------------------------
-
-- Documentation now available at numexpr.readthedocs.io
-- Support for floor() and ceil() functions added by Caleb P. Burns.
-- NumPy requirement increased from 1.6 to 1.7 due to changes in iterator
- flags (#245).
-- Sphinx autodocs support added for documentation on readthedocs.org.
-- Fixed a bug where complex constants would return an error, fixing
- problems with `sympy` when using NumExpr as a backend.
-- Fix for #277 whereby arrays of shape (1,...) would be reduced as
- if they were full reduction. Behavoir now matches that of NumPy.
-- String literals are automatically encoded into 'ascii' bytes for
- convience (see #281).
+- Python 3.8 support has been added.
+- Python 3.4 support is discontinued.
+- The tests are now compatible with NumPy 1.18.
+- `site.cfg.example` was updated to use the `libraries` tag instead of
`mkl_libs`,
+ which is recommended for newer version of NumPy.
What's Numexpr?
---------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/MANIFEST.in
new/numexpr-2.7.1/MANIFEST.in
--- old/numexpr-2.6.4/MANIFEST.in 2017-09-14 08:37:56.000000000 +0200
+++ new/numexpr-2.7.1/MANIFEST.in 2019-08-13 19:49:26.000000000 +0200
@@ -4,7 +4,6 @@
recursive-include numexpr *.cpp *.hpp *.py
recursive-include numexpr/win32 *.c *.h
-exclude numexpr/__config__.py
-exclude RELEASING.txt
+exclude numexpr/__config__.py RELEASING.txt site.cfg
recursive-include bench *.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/PKG-INFO new/numexpr-2.7.1/PKG-INFO
--- old/numexpr-2.6.4/PKG-INFO 2017-09-14 08:46:26.000000000 +0200
+++ new/numexpr-2.7.1/PKG-INFO 2020-01-05 20:07:23.504278700 +0100
@@ -1,11 +1,132 @@
Metadata-Version: 1.0
Name: numexpr
-Version: 2.6.4
+Version: 2.7.1
Summary: Fast numerical expression evaluator for NumPy
Home-page: https://github.com/pydata/numexpr
Author: David M. Cooke, Francesc Alted and others
Author-email: [email protected], [email protected]
License: MIT
-Description-Content-Type: UNKNOWN
-Description: UNKNOWN
+Description: ======================================================
+ NumExpr: Fast numerical expression evaluator for NumPy
+ ======================================================
+
+ :Author: David M. Cooke, Francesc Alted and others
+ :Contact: [email protected]
+ :URL: https://github.com/pydata/numexpr
+ :Documentation: http://numexpr.readthedocs.io/en/latest/
+ :Travis CI: |travis|
+ :Appveyor: |appveyor|
+ :PyPi: |version|
+ :DOI: |doi|
+ :readthedocs: |docs|
+
+ .. |travis| image::
https://travis-ci.org/pydata/numexpr.png?branch=master
+ :target: https://travis-ci.org/pydata/numexpr
+ .. |appveyor| image::
https://ci.appveyor.com/api/projects/status/we2ff01vqlmlb9ip
+ :target: https://ci.appveyor.com/project/robbmcleod/numexpr
+ .. |docs| image::
https://readthedocs.org/projects/numexpr/badge/?version=latest
+ :target: http://numexpr.readthedocs.io/en/latest
+ .. |doi| image::
https://zenodo.org/badge/doi/10.5281/zenodo.2483274.svg
+ :target: https://doi.org/10.5281/zenodo.2483274
+ .. |version| image:: https://img.shields.io/pypi/v/numexpr.png
+ :target: https://pypi.python.org/pypi/numexpr
+
+
+ What is NumExpr?
+ ----------------
+
+ NumExpr is a fast numerical expression evaluator for NumPy. With it,
+ expressions that operate on arrays (like :code:`'3*a+4*b'`) are
accelerated
+ and use less memory than doing the same calculation in Python.
+
+ In addition, its multi-threaded capabilities can make use of all your
+ cores -- which generally results in substantial performance scaling
compared
+ to NumPy.
+
+ Last but not least, numexpr can make use of Intel's VML (Vector Math
+ Library, normally integrated in its Math Kernel Library, or MKL).
+ This allows further acceleration of transcendent expressions.
+
+
+ How NumExpr achieves high performance
+ -------------------------------------
+
+ The main reason why NumExpr achieves better performance than NumPy is
+ that it avoids allocating memory for intermediate results. This
+ results in better cache utilization and reduces memory access in
+ general. Due to this, NumExpr works best with large arrays.
+
+ NumExpr parses expressions into its own op-codes that are then used by
+ an integrated computing virtual machine. The array operands are split
+ into small chunks that easily fit in the cache of the CPU and passed
+ to the virtual machine. The virtual machine then applies the
+ operations on each chunk. It's worth noting that all temporaries and
+ constants in the expression are also chunked. Chunks are distributed
among
+ the available cores of the CPU, resulting in highly parallelized code
+ execution.
+
+ The result is that NumExpr can get the most of your machine computing
+ capabilities for array-wise computations. Common speed-ups with regard
+ to NumPy are usually between 0.95x (for very simple expressions like
+ :code:`'a + 1'`) and 4x (for relatively complex ones like
:code:`'a*b-4.1*a >
+ 2.5*b'`), although much higher speed-ups can be achieved for some
functions
+ and complex math operations (up to 15x in some cases).
+
+ NumExpr performs best on matrices that are too large to fit in L1 CPU
cache.
+ In order to get a better idea on the different speed-ups that can be
achieved
+ on your platform, run the provided benchmarks.
+
+
+ Usage
+ -----
+
+ ::
+
+ >>> import numpy as np
+ >>> import numexpr as ne
+
+ >>> a = np.arange(1e6) # Choose large arrays for better speedups
+ >>> b = np.arange(1e6)
+
+ >>> ne.evaluate("a + 1") # a simple expression
+ array([ 1.00000000e+00, 2.00000000e+00, 3.00000000e+00, ...,
+ 9.99998000e+05, 9.99999000e+05, 1.00000000e+06])
+
+ >>> ne.evaluate('a*b-4.1*a > 2.5*b') # a more complex one
+ array([False, False, False, ..., True, True, True], dtype=bool)
+
+ >>> ne.evaluate("sin(a) + arcsinh(a/b)") # you can also use
functions
+ array([ NaN, 1.72284457, 1.79067101, ..., 1.09567006,
+ 0.17523598, -0.09597844])
+
+ >>> s = np.array(['abba', 'abbb', 'abbcdef'])
+ >>> ne.evaluate("'abba' == s") # string arrays are supported too
+ array([ True, False, False], dtype=bool)
+
+
+ Documentation
+ -------------
+
+ Please see the official documentation at `numexpr.readthedocs.io
<https://numexpr.readthedocs.io>`_.
+ Included is a user guide, benchmark results, and the reference API.
+
+
+ Authors
+ -------
+
+ Please see `AUTHORS.txt
<https://github.com/pydata/numexpr/blob/master/AUTHORS.txt>`_.
+
+
+ License
+ -------
+
+ NumExpr is distributed under the `MIT
<http://www.opensource.org/licenses/mit-license.php>`_ license.
+
+
+ .. Local Variables:
+ .. mode: text
+ .. coding: utf-8
+ .. fill-column: 70
+ .. End:
+
Platform: UNKNOWN
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/README.rst new/numexpr-2.7.1/README.rst
--- old/numexpr-2.6.4/README.rst 2017-09-14 08:37:56.000000000 +0200
+++ new/numexpr-2.7.1/README.rst 2018-12-21 19:41:59.000000000 +0100
@@ -9,14 +9,17 @@
:Travis CI: |travis|
:Appveyor: |appveyor|
:PyPi: |version|
+:DOI: |doi|
:readthedocs: |docs|
.. |travis| image:: https://travis-ci.org/pydata/numexpr.png?branch=master
:target: https://travis-ci.org/pydata/numexpr
-.. |appveyor| image::
https://ci.appveyor.com/api/projects/status/github/pydata/numexpr
- :target: https://ci.appveyor.com/project/pydata/numexpr
-.. |docs| image::
https://media.readthedocs.org/static/projects/badges/passing.svg
+.. |appveyor| image::
https://ci.appveyor.com/api/projects/status/we2ff01vqlmlb9ip
+ :target: https://ci.appveyor.com/project/robbmcleod/numexpr
+.. |docs| image::
https://readthedocs.org/projects/numexpr/badge/?version=latest
:target: http://numexpr.readthedocs.io/en/latest
+.. |doi| image:: https://zenodo.org/badge/doi/10.5281/zenodo.2483274.svg
+ :target: https://doi.org/10.5281/zenodo.2483274
.. |version| image:: https://img.shields.io/pypi/v/numexpr.png
:target: https://pypi.python.org/pypi/numexpr
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/RELEASE_NOTES.rst
new/numexpr-2.7.1/RELEASE_NOTES.rst
--- old/numexpr-2.6.4/RELEASE_NOTES.rst 2017-09-14 08:42:38.000000000 +0200
+++ new/numexpr-2.7.1/RELEASE_NOTES.rst 2020-01-04 01:21:42.000000000 +0100
@@ -1,13 +1,89 @@
-=====================================
- Release notes for Numexpr 2.6 series
-=====================================
+====================================
+Release notes for Numexpr 2.7 series
+====================================
+
+Changes from 2.7.0 to 2.7.1
+----------------------------
+
+- Python 3.8 support has been added.
+- Python 3.4 support is discontinued.
+- The tests are now compatible with NumPy 1.18.
+- `site.cfg.example` was updated to use the `libraries` tag instead of
`mkl_libs`,
+ which is recommended for newer version of NumPy.
+
+Changes from 2.6.9 to 2.7.0
+----------------------------
+
+- The default number of 'safe' threads has been restored to the historical
limit
+ of 8, if the environment variable "NUMEXPR_MAX_THREADS" has not been set.
+- Thanks to @eltoder who fixed a small memory leak.
+- Support for Python 2.6 has been dropped, as it is no longer available via
+ TravisCI.
+- A typo in the test suite that had a less than rather than greater than
symbol
+ in the NumPy version check has been corrected thanks to dhomeier.
+- The file `site.cfg` was being accidently included in the sdists on PyPi.
+ It has now been excluded.
+
+Changes from 2.6.8 to 2.6.9
+---------------------------
+
+- Thanks to Mike Toews for more robust handling of the thread-setting
+ environment variables.
+- With Appveyor updating to Python 3.7.1, wheels for Python 3.7 are now
+ available in addition to those for other OSes.
+
+Changes from 2.6.7 to 2.6.8
+---------------------------
+
+- Add check to make sure that `f_locals` is not actually `f_globals` when we
+ do the `f_locals` clear to avoid the #310 memory leak issue.
+- Compare NumPy versions using `distutils.version.LooseVersion` to avoid issue
+ #312 when working with NumPy development versions.
+- As part of `multibuild`, wheels for Python 3.7 for Linux and MacOSX are now
+ available on PyPI.
+
+Changes from 2.6.6 to 2.6.7
+---------------------------
+
+- Thanks to Lehman Garrison for finding and fixing a bug that exhibited memory
+ leak-like behavior. The use in `numexpr.evaluate` of `sys._getframe`
combined
+ with `.f_locals` from that frame object results an extra refcount on objects
+ in the frame that calls `numexpr.evaluate`, and not `evaluate`'s frame. So
if
+ the calling frame remains in scope for a long time (such as a procedural
+ script where `numexpr` is called from the base frame) garbage collection
would
+ never occur.
+- Imports for the `numexpr.test` submodule were made lazy in the `numexpr`
module.
+
+Changes from 2.6.5 to 2.6.6
+---------------------------
+
+- Thanks to Mark Dickinson for a fix to the thread barrier that occassionally
+ suffered from spurious wakeups on MacOSX.
+
+Changes from 2.6.4 to 2.6.5
+---------------------------
+
+- The maximum thread count can now be set at import-time by setting the
+ environment variable 'NUMEXPR_MAX_THREADS'. The default number of
+ max threads was lowered from 4096 (which was deemed excessive) to 64.
+- A number of imports were removed (pkg_resources) or made lazy (cpuinfo) in
+ order to speed load-times for downstream packages (such as `pandas`,
`sympy`,
+ and `tables`). Import time has dropped from about 330 ms to 90 ms. Thanks to
+ Jason Sachs for pointing out the source of the slow-down.
+- Thanks to Alvaro Lopez Ortega for updates to benchmarks to be compatible
with
+ Python 3.
+- Travis and AppVeyor now fail if the test module fails or errors.
+- Thanks to Mahdi Ben Jelloul for a patch that removed a bug where constants
+ in `where` calls would raise a ValueError.
+- Fixed a bug whereby all-constant power operations would lead to infinite
+ recursion.
Changes from 2.6.3 to 2.6.4
---------------------------
-- Christoph Gohkle noticed a lack of coverage for the 2.6.3
+- Christoph Gohlke noticed a lack of coverage for the 2.6.3
`floor` and `ceil` functions for MKL that caused seg-faults in
- test, so thanks to him for that.
+ test, so thanks to him for that.
Changes from 2.6.2 to 2.6.3
---------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/__init__.py
new/numexpr-2.7.1/numexpr/__init__.py
--- old/numexpr-2.6.4/numexpr/__init__.py 2017-09-14 08:37:56.000000000
+0200
+++ new/numexpr-2.7.1/numexpr/__init__.py 2019-01-28 20:07:35.000000000
+0100
@@ -28,44 +28,44 @@
else:
use_vml = False
-from cpuinfo import cpu
+is_cpu_amd_intel = False # DEPRECATION WARNING: WILL BE REMOVED IN FUTURE
RELEASE
-if cpu.is_AMD() or cpu.is_Intel():
- is_cpu_amd_intel = True
-else:
- is_cpu_amd_intel = False
+# cpuinfo imports were moved into the test submodule function that calls them
+# to improve import times.
import os, os.path
import platform
from numexpr.expressions import E
from numexpr.necompiler import NumExpr, disassemble, evaluate, re_evaluate
-from numexpr.tests import test, print_versions
-from numexpr.utils import (
+from numexpr.interpreter import MAX_THREADS
+from numexpr.utils import (_init_num_threads,
get_vml_version, set_vml_accuracy_mode, set_vml_num_threads,
set_num_threads, detect_number_of_cores, detect_number_of_threads)
# Detect the number of cores
ncores = detect_number_of_cores()
-nthreads = detect_number_of_threads()
-
# Initialize the number of threads to be used
-if 'sparc' in platform.machine():
- import warnings
-
- warnings.warn('The number of threads have been set to 1 because problems
related '
- 'to threading have been reported on some sparc machine. '
- 'The number of threads can be changed using the
"set_num_threads" '
- 'function.')
- set_num_threads(1)
-else:
- set_num_threads(nthreads)
-
+nthreads = _init_num_threads()
# The default for VML is 1 thread (see #39)
set_vml_num_threads(1)
import version
-
-dirname = os.path.dirname(__file__)
-
__version__ = version.version
+def print_versions():
+ """Print the versions of software that numexpr relies on."""
+ try:
+ import numexpr.tests
+ return numexpr.tests.print_versions()
+ except ImportError:
+ # To maintain Python 2.6 compatibility we have simple error handling
+ raise ImportError('`numexpr.tests` could not be imported, likely it
was excluded from the distribution.')
+
+def test(verbosity=1):
+ """Run all the tests in the test suite."""
+ try:
+ import numexpr.tests
+ return numexpr.tests.test(verbosity=verbosity)
+ except ImportError:
+ # To maintain Python 2.6 compatibility we have simple error handling
+ raise ImportError('`numexpr.tests` could not be imported, likely it
was excluded from the distribution.')
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/cpuinfo.py
new/numexpr-2.7.1/numexpr/cpuinfo.py
--- old/numexpr-2.6.4/numexpr/cpuinfo.py 2017-09-14 08:37:56.000000000
+0200
+++ new/numexpr-2.7.1/numexpr/cpuinfo.py 2018-09-28 17:35:10.000000000
+0200
@@ -32,6 +32,7 @@
import platform
import inspect
+is_cpu_amd_intel = False # DEPRECATION WARNING: WILL BE REMOVED IN FUTURE
RELEASE
def getoutput(cmd, successful_status=(0,), stacklevel=1):
try:
@@ -255,16 +256,16 @@
return self.is_PentiumIV() and self.has_sse3()
def _is_Nocona(self):
- return self.is_Intel() \
- and (self.info[0]['cpu family'] == '6' \
- or self.info[0]['cpu family'] == '15' ) \
- and (self.has_sse3() and not self.has_ssse3()) \
- and re.match(r'.*?\blm\b', self.info[0]['flags']) is not None
+ return (self.is_Intel() and
+ self.info[0]['cpu family'] in ('6', '15') and
+ # two s sse3; three s ssse3 not the same thing, this is fine
+ (self.has_sse3() and not self.has_ssse3()) and
+ re.match(r'.*?\blm\b', self.info[0]['flags']) is not None)
def _is_Core2(self):
- return self.is_64bit() and self.is_Intel() and \
- re.match(r'.*?Core\(TM\)2\b', \
- self.info[0]['model name']) is not None
+ return (self.is_64bit() and self.is_Intel() and
+ re.match(r'.*?Core\(TM\)2\b',
+ self.info[0]['model name']) is not None)
def _is_Itanium(self):
return re.match(r'.*?Itanium\b',
@@ -658,7 +659,7 @@
try:
#XXX: Bad style to use so long `try:...except:...`. Fix it!
- prgx = re.compile(r"family\s+(?P<FML>\d+)\s+model\s+(?P<MDL>\d+)" \
+ prgx = re.compile(r"family\s+(?P<FML>\d+)\s+model\s+(?P<MDL>\d+)"
"\s+stepping\s+(?P<STP>\d+)", re.IGNORECASE)
chnd = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, self.pkey)
pnum = 0
@@ -705,20 +706,20 @@
return self.is_AMD() and self.info[0]['Family'] == 4
def _is_AMDK5(self):
- return self.is_AMD() and self.info[0]['Family'] == 5 \
- and self.info[0]['Model'] in [0, 1, 2, 3]
+ return (self.is_AMD() and self.info[0]['Family'] == 5 and
+ self.info[0]['Model'] in [0, 1, 2, 3])
def _is_AMDK6(self):
- return self.is_AMD() and self.info[0]['Family'] == 5 \
- and self.info[0]['Model'] in [6, 7]
+ return (self.is_AMD() and self.info[0]['Family'] == 5 and
+ self.info[0]['Model'] in [6, 7])
def _is_AMDK6_2(self):
- return self.is_AMD() and self.info[0]['Family'] == 5 \
- and self.info[0]['Model'] == 8
+ return (self.is_AMD() and self.info[0]['Family'] == 5 and
+ self.info[0]['Model'] == 8)
def _is_AMDK6_3(self):
- return self.is_AMD() and self.info[0]['Family'] == 5 \
- and self.info[0]['Model'] == 9
+ return (self.is_AMD() and self.info[0]['Family'] == 5 and
+ self.info[0]['Model'] == 9)
def _is_AMDK7(self):
return self.is_AMD() and self.info[0]['Family'] == 6
@@ -751,31 +752,31 @@
return self.is_Intel() and self.info[0]['Family'] == 5
def _is_PentiumMMX(self):
- return self.is_Intel() and self.info[0]['Family'] == 5 \
- and self.info[0]['Model'] == 4
+ return (self.is_Intel() and self.info[0]['Family'] == 5 and
+ self.info[0]['Model'] == 4)
def _is_PentiumPro(self):
- return self.is_Intel() and self.info[0]['Family'] == 6 \
- and self.info[0]['Model'] == 1
+ return (self.is_Intel() and self.info[0]['Family'] == 6 and
+ self.info[0]['Model'] == 1)
def _is_PentiumII(self):
- return self.is_Intel() and self.info[0]['Family'] == 6 \
- and self.info[0]['Model'] in [3, 5, 6]
+ return (self.is_Intel() and self.info[0]['Family'] == 6 and
+ self.info[0]['Model'] in [3, 5, 6])
def _is_PentiumIII(self):
- return self.is_Intel() and self.info[0]['Family'] == 6 \
- and self.info[0]['Model'] in [7, 8, 9, 10, 11]
+ return (self.is_Intel() and self.info[0]['Family'] == 6 and
+ self.info[0]['Model'] in [7, 8, 9, 10, 11])
def _is_PentiumIV(self):
return self.is_Intel() and self.info[0]['Family'] == 15
def _is_PentiumM(self):
- return self.is_Intel() and self.info[0]['Family'] == 6 \
- and self.info[0]['Model'] in [9, 13, 14]
+ return (self.is_Intel() and self.info[0]['Family'] == 6 and
+ self.info[0]['Model'] in [9, 13, 14])
def _is_Core2(self):
- return self.is_Intel() and self.info[0]['Family'] == 6 \
- and self.info[0]['Model'] in [15, 16, 17]
+ return (self.is_Intel() and self.info[0]['Family'] == 6 and
+ self.info[0]['Model'] in [15, 16, 17])
# Varia
@@ -787,8 +788,9 @@
def _has_mmx(self):
if self.is_Intel():
- return (self.info[0]['Family'] == 5 and self.info[0]['Model'] ==
4) \
- or (self.info[0]['Family'] in [6, 15])
+ return ((self.info[0]['Family'] == 5 and
+ self.info[0]['Model'] == 4) or
+ (self.info[0]['Family'] in [6, 15]))
elif self.is_AMD():
return self.info[0]['Family'] in [5, 6, 15]
else:
@@ -796,20 +798,19 @@
def _has_sse(self):
if self.is_Intel():
- return (self.info[0]['Family'] == 6 and \
- self.info[0]['Model'] in [7, 8, 9, 10, 11]) \
- or self.info[0]['Family'] == 15
+ return ((self.info[0]['Family'] == 6 and
+ self.info[0]['Model'] in [7, 8, 9, 10, 11]) or
+ self.info[0]['Family'] == 15)
elif self.is_AMD():
- return (self.info[0]['Family'] == 6 and \
- self.info[0]['Model'] in [6, 7, 8, 10]) \
- or self.info[0]['Family'] == 15
+ return ((self.info[0]['Family'] == 6 and
+ self.info[0]['Model'] in [6, 7, 8, 10]) or
+ self.info[0]['Family'] == 15)
else:
return False
def _has_sse2(self):
if self.is_Intel():
- return self.is_Pentium4() or self.is_PentiumM() \
- or self.is_Core2()
+ return self.is_Pentium4() or self.is_PentiumM() or self.is_Core2()
elif self.is_AMD():
return self.is_AMD64()
else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/expressions.py
new/numexpr-2.7.1/numexpr/expressions.py
--- old/numexpr-2.6.4/numexpr/expressions.py 2017-09-14 08:37:56.000000000
+0200
+++ new/numexpr-2.7.1/numexpr/expressions.py 2018-08-15 20:03:58.000000000
+0200
@@ -15,8 +15,10 @@
import threading
import numpy
-from pkg_resources import parse_version
-_np_version = parse_version(numpy.__version__)
+# numpy's behavoir sometimes changes with versioning, especially in regard as
+# to when ints are cast to floats.
+from distutils.version import LooseVersion
+_np_version_forbids_neg_powint = LooseVersion(numpy.__version__) >=
LooseVersion('1.12.0b1')
# Declare a double type that does not exist in Python space
double = numpy.double
@@ -216,8 +218,7 @@
@ophelper
def where_func(a, b, c):
if isinstance(a, ConstantNode):
- #FIXME: This prevents where(True, a, b)
- raise ValueError("too many dimensions")
+ return b if a.value else c
if allConstantNodes([a, b, c]):
return ConstantNode(numpy.where(a, b, c))
return FuncNode('where', [a, b, c])
@@ -282,7 +283,7 @@
@ophelper
def pow_op(a, b):
- if (_np_version >= parse_version('1.12.0b1') and
+ if (_np_version_forbids_neg_powint and
b.astKind in ('int', 'long') and
a.astKind in ('int', 'long') and
numpy.any(b.value < 0)):
@@ -291,7 +292,7 @@
'Integers to negative integer powers are not allowed.')
if allConstantNodes([a, b]):
- return ConstantNode(a ** b)
+ return ConstantNode(a.value ** b.value)
if isinstance(b, ConstantNode):
x = b.value
if get_optimization() == 'aggressive':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/interpreter.cpp
new/numexpr-2.7.1/numexpr/interpreter.cpp
--- old/numexpr-2.6.4/numexpr/interpreter.cpp 2017-09-14 08:37:56.000000000
+0200
+++ new/numexpr-2.7.1/numexpr/interpreter.cpp 2018-07-12 19:49:43.000000000
+0200
@@ -772,9 +772,13 @@
pthread_mutex_lock(&gs.count_threads_mutex);
if (gs.count_threads < gs.nthreads) {
gs.count_threads++;
- pthread_cond_wait(&gs.count_threads_cv, &gs.count_threads_mutex);
+ /* Beware of spurious wakeups. See issue pydata/numexpr#306. */
+ do {
+ pthread_cond_wait(&gs.count_threads_cv, &gs.count_threads_mutex);
+ } while (!gs.barrier_passed);
}
else {
+ gs.barrier_passed = 1;
pthread_cond_broadcast(&gs.count_threads_cv);
}
pthread_mutex_unlock(&gs.count_threads_mutex);
@@ -783,9 +787,12 @@
pthread_mutex_lock(&gs.count_threads_mutex);
if (gs.count_threads > 0) {
gs.count_threads--;
- pthread_cond_wait(&gs.count_threads_cv, &gs.count_threads_mutex);
+ do {
+ pthread_cond_wait(&gs.count_threads_cv, &gs.count_threads_mutex);
+ } while (gs.barrier_passed);
}
else {
+ gs.barrier_passed = 0;
pthread_cond_broadcast(&gs.count_threads_cv);
}
pthread_mutex_unlock(&gs.count_threads_mutex);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/interpreter.hpp
new/numexpr-2.7.1/numexpr/interpreter.hpp
--- old/numexpr-2.6.4/numexpr/interpreter.hpp 2017-09-14 08:37:56.000000000
+0200
+++ new/numexpr-2.7.1/numexpr/interpreter.hpp 2018-07-12 19:33:23.000000000
+0200
@@ -75,12 +75,17 @@
int ret_code;
int *pc_error;
char **errmsg;
+ // NOTE: memsteps, iter, and reduce_iter are arrays, they MUST be
allocated
+ // to length `global_max_threads` before module load.
// One memsteps array per thread
- npy_intp *memsteps[MAX_THREADS];
+ // npy_intp *memsteps[MAX_THREADS];
+ npy_intp **memsteps;
// One iterator per thread */
- NpyIter *iter[MAX_THREADS];
+ // NpyIter *iter[MAX_THREADS];
+ NpyIter **iter;
// When doing nested iteration for a reduction
- NpyIter *reduce_iter[MAX_THREADS];
+ // NpyIter *reduce_iter[MAX_THREADS]
+ NpyIter **reduce_iter;
// Flag indicating reduction is the outer loop instead of the inner
bool reduction_outer_loop;
// Flag indicating whether output buffering is needed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/module.cpp
new/numexpr-2.7.1/numexpr/module.cpp
--- old/numexpr-2.6.4/numexpr/module.cpp 2017-09-14 08:37:56.000000000
+0200
+++ new/numexpr-2.7.1/numexpr/module.cpp 2019-08-13 22:12:07.000000000
+0200
@@ -21,6 +21,7 @@
// Global state. The file interpreter.hpp also has some global state
// in its 'th_params' variable
global_state gs;
+long global_max_threads=DEFAULT_MAX_THREADS;
/* Do the worker job for a certain thread */
@@ -55,9 +56,14 @@
pthread_mutex_lock(&gs.count_threads_mutex);
if (gs.count_threads < gs.nthreads) {
gs.count_threads++;
- pthread_cond_wait(&gs.count_threads_cv, &gs.count_threads_mutex);
+ /* Beware of spurious wakeups. See issue pydata/numexpr#306. */
+ do {
+ pthread_cond_wait(&gs.count_threads_cv,
+ &gs.count_threads_mutex);
+ } while (!gs.barrier_passed);
}
else {
+ gs.barrier_passed = 1;
pthread_cond_broadcast(&gs.count_threads_cv);
}
pthread_mutex_unlock(&gs.count_threads_mutex);
@@ -163,9 +169,13 @@
pthread_mutex_lock(&gs.count_threads_mutex);
if (gs.count_threads > 0) {
gs.count_threads--;
- pthread_cond_wait(&gs.count_threads_cv, &gs.count_threads_mutex);
+ do {
+ pthread_cond_wait(&gs.count_threads_cv,
+ &gs.count_threads_mutex);
+ } while (gs.barrier_passed);
}
else {
+ gs.barrier_passed = 0;
pthread_cond_broadcast(&gs.count_threads_cv);
}
pthread_mutex_unlock(&gs.count_threads_mutex);
@@ -185,6 +195,11 @@
{
int tid, rc;
+ if ( !(gs.nthreads > 1 && (!gs.init_threads_done || gs.pid != getpid())) )
{
+ /* Thread pool must always be initialized once and once only. */
+ return(0);
+ }
+
/* Initialize mutex and condition variable objects */
pthread_mutex_init(&gs.count_mutex, NULL);
pthread_mutex_init(&gs.parallel_mutex, NULL);
@@ -193,6 +208,7 @@
pthread_mutex_init(&gs.count_threads_mutex, NULL);
pthread_cond_init(&gs.count_threads_cv, NULL);
gs.count_threads = 0; /* Reset threads counter */
+ gs.barrier_passed = 0;
/* Finally, create the threads */
for (tid = 0; tid < gs.nthreads; tid++) {
@@ -220,10 +236,16 @@
int t, rc;
void *status;
- if (nthreads_new > MAX_THREADS) {
+ // if (nthreads_new > MAX_THREADS) {
+ // fprintf(stderr,
+ // "Error. nthreads cannot be larger than MAX_THREADS (%d)",
+ // MAX_THREADS);
+ // return -1;
+ // }
+ if (nthreads_new > global_max_threads) {
fprintf(stderr,
- "Error. nthreads cannot be larger than MAX_THREADS (%d)",
- MAX_THREADS);
+ "Error. nthreads cannot be larger than environment variable
\"NUMEXPR_MAX_THREADS\" (%ld)",
+ global_max_threads);
return -1;
}
else if (nthreads_new <= 0) {
@@ -240,9 +262,13 @@
pthread_mutex_lock(&gs.count_threads_mutex);
if (gs.count_threads < gs.nthreads) {
gs.count_threads++;
- pthread_cond_wait(&gs.count_threads_cv, &gs.count_threads_mutex);
+ do {
+ pthread_cond_wait(&gs.count_threads_cv,
+ &gs.count_threads_mutex);
+ } while (!gs.barrier_passed);
}
else {
+ gs.barrier_passed = 1;
pthread_cond_broadcast(&gs.count_threads_cv);
}
pthread_mutex_unlock(&gs.count_threads_mutex);
@@ -264,9 +290,7 @@
/* Launch a new pool of threads (if necessary) */
gs.nthreads = nthreads_new;
- if (gs.nthreads > 1 && (!gs.init_threads_done || gs.pid != getpid())) {
- init_threads();
- }
+ init_threads();
return nthreads_old;
}
@@ -342,12 +366,15 @@
o = PyLong_FromLong(name);
s = PyBytes_FromString(sname);
- if (!s) {
+ if (!o || !s) {
PyErr_SetString(PyExc_RuntimeError, routine_name);
- return -1;
+ r = -1;
+ }
+ else {
+ r = PyDict_SetItem(d, s, o);
}
- r = PyDict_SetItem(d, s, o);
Py_XDECREF(o);
+ Py_XDECREF(s);
return r;
}
@@ -384,6 +411,22 @@
{
PyObject *m, *d;
+
+ char *max_thread_str = getenv("NUMEXPR_MAX_THREADS");
+ char *end;
+ if (max_thread_str != NULL) {
+ global_max_threads = strtol(max_thread_str, &end, 10);
+ }
+
+
+ th_params.memsteps = (npy_intp**)calloc(sizeof(npy_intp*),
global_max_threads);
+ th_params.iter = (NpyIter**)calloc(sizeof(NpyIter*),
global_max_threads);
+ th_params.reduce_iter = (NpyIter**)calloc(sizeof(NpyIter*),
global_max_threads);
+ gs.threads = (pthread_t*)calloc(sizeof(pthread_t),
global_max_threads);
+ gs.tids = (int*)calloc(sizeof(int),
global_max_threads);
+ // TODO: for Py3, deallocate:
https://docs.python.org/3/c-api/module.html#c.PyModuleDef.m_free
+ // For Python 2.7, people have to exit the process to reclaim the memory.
+
if (PyType_Ready(&NumExprType) < 0)
INITERROR;
@@ -437,6 +480,8 @@
if (PyModule_AddObject(m, "allaxes", PyLong_FromLong(255)) < 0) INITERROR;
if (PyModule_AddObject(m, "maxdims", PyLong_FromLong(NPY_MAXDIMS)) < 0)
INITERROR;
+ if(PyModule_AddIntConstant(m, "MAX_THREADS", global_max_threads) < 0)
INITERROR;
+
#if PY_MAJOR_VERSION >= 3
return m;
#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/module.hpp
new/numexpr-2.7.1/numexpr/module.hpp
--- old/numexpr-2.6.4/numexpr/module.hpp 2017-09-14 08:37:56.000000000
+0200
+++ new/numexpr-2.7.1/numexpr/module.hpp 2018-07-12 19:49:44.000000000
+0200
@@ -21,8 +21,12 @@
int nthreads; /* number of desired threads in pool */
int init_threads_done; /* pool of threads initialized? */
int end_threads; /* should exisiting threads end? */
- pthread_t threads[MAX_THREADS]; /* opaque structure for threads */
- int tids[MAX_THREADS]; /* ID per each thread */
+ // pthread_t threads[MAX_THREADS]; /* opaque structure for threads */
+ // int tids[MAX_THREADS]; /* ID per each thread */
+ /* NOTE: threads and tids are arrays, they MUST be allocated to length
+ `global_max_threads` before module load. */
+ pthread_t *threads; /* opaque structure for threads */
+ int *tids; /* ID per each thread */
npy_intp gindex; /* global index for all threads */
int init_sentinels_done; /* sentinels initialized? */
int giveup; /* should parallel code giveup? */
@@ -32,6 +36,8 @@
/* Synchronization variables for threadpool state */
pthread_mutex_t count_mutex;
int count_threads;
+ int barrier_passed; /* indicates if the thread pool's thread
barrier
+ is unlocked and ready for the VM to
process.*/
pthread_mutex_t count_threads_mutex;
pthread_cond_t count_threads_cv;
@@ -41,6 +47,7 @@
global_state() {
nthreads = 1;
init_threads_done = 0;
+ barrier_passed = 0;
end_threads = 0;
pid = 0;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/necompiler.py
new/numexpr-2.7.1/numexpr/necompiler.py
--- old/numexpr-2.6.4/numexpr/necompiler.py 2017-09-14 08:37:56.000000000
+0200
+++ new/numexpr-2.7.1/numexpr/necompiler.py 2018-08-16 03:01:37.000000000
+0200
@@ -13,7 +13,8 @@
import numpy
import threading
-from numexpr import interpreter, expressions, use_vml, is_cpu_amd_intel
+is_cpu_amd_intel = False # DEPRECATION WARNING: WILL BE REMOVED IN FUTURE
RELEASE
+from numexpr import interpreter, expressions, use_vml
from numexpr.utils import CacheDict
# Declare a double type that does not exist in Python space
@@ -545,8 +546,7 @@
raise ValueError("Unknown keyword argument '%s'" % d.popitem()[0])
if context['truediv'] == 'auto':
caller_globals = sys._getframe(frame_depth + 1).f_globals
- context['truediv'] = \
- caller_globals.get('division', None) == __future__.division
+ context['truediv'] = caller_globals.get('division', None) ==
__future__.division
return context
@@ -623,8 +623,7 @@
# translated to either True or False).
context = getContext(kwargs, frame_depth=1)
- threeAddrProgram, inputsig, tempsig, constants, input_names = \
- precompile(ex, signature, context)
+ threeAddrProgram, inputsig, tempsig, constants, input_names =
precompile(ex, signature, context)
program = compileThreeAddrForm(threeAddrProgram)
return interpreter.NumExpr(inputsig.encode('ascii'),
tempsig.encode('ascii'),
@@ -725,18 +724,34 @@
def getArguments(names, local_dict=None, global_dict=None):
"""Get the arguments based on the names."""
call_frame = sys._getframe(2)
+
+ clear_local_dict = False
if local_dict is None:
local_dict = call_frame.f_locals
- if global_dict is None:
- global_dict = call_frame.f_globals
+ clear_local_dict = True
+ try:
+ frame_globals = call_frame.f_globals
+ if global_dict is None:
+ global_dict = frame_globals
+
+ # If `call_frame` is the top frame of the interpreter we can't clear
its
+ # `local_dict`, because it is actually the `global_dict`.
+ clear_local_dict = clear_local_dict and not frame_globals is local_dict
+
+ arguments = []
+ for name in names:
+ try:
+ a = local_dict[name]
+ except KeyError:
+ a = global_dict[name]
+ arguments.append(numpy.asarray(a))
+ finally:
+ # If we generated local_dict via an explicit reference to f_locals,
+ # clear the dict to prevent creating extra ref counts in the caller's
scope
+ # See https://github.com/pydata/numexpr/issues/310
+ if clear_local_dict:
+ local_dict.clear()
- arguments = []
- for name in names:
- try:
- a = local_dict[name]
- except KeyError:
- a = global_dict[name]
- arguments.append(numpy.asarray(a))
return arguments
@@ -811,8 +826,7 @@
try:
compiled_ex = _numexpr_cache[numexpr_key]
except KeyError:
- compiled_ex = _numexpr_cache[numexpr_key] = \
- NumExpr(ex, signature, **context)
+ compiled_ex = _numexpr_cache[numexpr_key] = NumExpr(ex, signature,
**context)
kwargs = {'out': out, 'order': order, 'casting': casting,
'ex_uses_vml': ex_uses_vml}
_numexpr_last = dict(ex=compiled_ex, argnames=names, kwargs=kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/numexpr_config.hpp
new/numexpr-2.7.1/numexpr/numexpr_config.hpp
--- old/numexpr-2.6.4/numexpr/numexpr_config.hpp 2017-09-14
08:37:56.000000000 +0200
+++ new/numexpr-2.7.1/numexpr/numexpr_config.hpp 2019-01-28
20:02:45.000000000 +0100
@@ -21,10 +21,9 @@
#define BLOCK_SIZE2 16
#endif
-/* The maximum number of threads (for some static arrays).
- * Choose this large enough for most monsters out there.
- Keep in sync this with the number in __init__.py. */
-#define MAX_THREADS 4096
+// The default threadpool size. It's prefer that the user set this via an
+// environment variable, "NUMEXPR_MAX_THREADS"
+#define DEFAULT_MAX_THREADS 64
#if defined(_WIN32)
#include "win32/pthread.h"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/tests/test_numexpr.py
new/numexpr-2.7.1/numexpr/tests/test_numexpr.py
--- old/numexpr-2.6.4/numexpr/tests/test_numexpr.py 2017-09-14
08:37:56.000000000 +0200
+++ new/numexpr-2.7.1/numexpr/tests/test_numexpr.py 2020-01-03
18:25:02.000000000 +0100
@@ -14,6 +14,7 @@
import platform
import warnings
from contextlib import contextmanager
+import subprocess
import numpy as np
from numpy import (
@@ -35,11 +36,12 @@
TestCase = unittest.TestCase
double = np.double
-
+if sys.version_info[0] >= 3:
+ long = int
# Recommended minimum versions
-minimum_numpy_version = "1.6"
-
+from distutils.version import LooseVersion
+minimum_numpy_version = LooseVersion('1.7.0')
class test_numexpr(TestCase):
"""Testing with 1 thread"""
@@ -295,6 +297,46 @@
b = b'a' * 40
res = evaluate('contains(a, b)')
assert_equal(res, True)
+
+ def test_where_scalar_bool(self):
+ a = True
+ b = array([1, 2])
+ c = array([3, 4])
+ res = evaluate('where(a, b, c)')
+ assert_array_equal(res, b)
+ a = False
+ res = evaluate('where(a, b, c)')
+ assert_array_equal(res, c)
+
+
+ def test_refcount(self):
+ # Regression test for issue #310
+ a = array([1])
+ assert sys.getrefcount(a) == 2
+ evaluate('1')
+ assert sys.getrefcount(a) == 2
+
+ def test_locals_clears_globals(self):
+ # Check for issue #313, whereby clearing f_locals also clear f_globals
+ # if in the top-frame. This cannot be done inside `unittest` as it is
always
+ # executing code in a child frame.
+ script = r';'.join([
+ r"import numexpr as ne",
+ r"a=10",
+ r"ne.evaluate('1')",
+ r"a += 1",
+ r"ne.evaluate('2', local_dict={})",
+ r"a += 1",
+ r"ne.evaluate('3', global_dict={})",
+ r"a += 1",
+ r"ne.evaluate('4', local_dict={}, global_dict={})",
+ r"a += 1",
+ ])
+ # Raises CalledProcessError on a non-normal exit
+ check = subprocess.check_call([sys.executable, '-c', script])
+ # Ideally this test should also be done against ipython but it's not
+ # a requirement.
+
class test_numexpr2(test_numexpr):
@@ -463,7 +505,7 @@
# Execution order set here so as to not use too many threads
# during the rest of the execution. See #33 for details.
def test_changing_nthreads_00_inc(self):
- a = linspace(-1, 1, 1e6)
+ a = linspace(-1, 1, 1000000)
b = ((.25 * a + .75) * a - 1.5) * a - 2
for nthreads in range(1, 7):
numexpr.set_num_threads(nthreads)
@@ -471,7 +513,7 @@
assert_array_almost_equal(b, c)
def test_changing_nthreads_01_dec(self):
- a = linspace(-1, 1, 1e6)
+ a = linspace(-1, 1, 1000000)
b = ((.25 * a + .75) * a - 1.5) * a - 2
for nthreads in range(6, 1, -1):
numexpr.set_num_threads(nthreads)
@@ -625,8 +667,7 @@
neval, type(neval),
shape(neval))
method.description = ('test_expressions(%s, test_scalar=%r, '
- 'dtype=%r, optimization=%r, exact=%r)') \
- % (expr, test_scalar, dtype.__name__,
optimization, exact)
+ 'dtype=%r, optimization=%r, exact=%r)') % (expr,
test_scalar, dtype.__name__, optimization, exact)
test_no[0] += 1
method.__name__ = 'test_scalar%d_%s_%s_%s_%04d' % (test_scalar,
dtype.__name__,
@@ -915,17 +956,39 @@
else:
del os.environ[key]
-
# Test cases for the threading configuration
class test_threading_config(TestCase):
+ def test_max_threads_unset(self):
+ # Has to be done in a subprocess as `importlib.reload` doesn't let us
+ # re-initialize the threadpool
+ script = '\n'.join([
+ "import os",
+ "if 'NUMEXPR_MAX_THREADS' in os.environ:
os.environ.pop('NUMEXPR_MAX_THREADS')",
+ "import numexpr",
+ "assert(numexpr.nthreads <= 8)",
+ "exit(0)"])
+ subprocess.check_call([sys.executable, '-c', script])
+
+ def test_max_threads_set(self):
+ # Has to be done in a subprocess as `importlib.reload` doesn't let us
+ # re-initialize the threadpool
+ script = '\n'.join([
+ "import os",
+ "os.environ['NUMEXPR_MAX_THREADS'] = '4'",
+ "import numexpr",
+ "assert(numexpr.MAX_THREADS == 4)",
+ "exit(0)"])
+ subprocess.check_call([sys.executable, '-c', script])
+
def test_numexpr_num_threads(self):
with _environment('OMP_NUM_THREADS', '5'):
+ # NUMEXPR_NUM_THREADS has priority
with _environment('NUMEXPR_NUM_THREADS', '3'):
- self.assertEquals(3, numexpr.detect_number_of_threads())
+ self.assertEquals(3, numexpr._init_num_threads())
def test_omp_num_threads(self):
with _environment('OMP_NUM_THREADS', '5'):
- self.assertEquals(5, numexpr.detect_number_of_threads())
+ self.assertEquals(5, numexpr._init_num_threads())
# Case test for threads
@@ -995,23 +1058,35 @@
def print_versions():
"""Print the versions of software that numexpr relies on."""
- from pkg_resources import parse_version
- if parse_version(np.__version__) < parse_version(minimum_numpy_version):
- print("*Warning*: NumPy version is lower than recommended: %s < %s" % \
- (np.__version__, minimum_numpy_version))
+ # from pkg_resources import parse_version
+ from numexpr.cpuinfo import cpu
+ import platform
+
+ np_version = LooseVersion(np.__version__)
+
+ if np_version < minimum_numpy_version:
+ print('*Warning*: NumPy version is lower than recommended: %s < %s' %
(np_version, minimum_numpy_version))
print('-=' * 38)
- print("Numexpr version: %s" % numexpr.__version__)
- print("NumPy version: %s" % np.__version__)
+ print('Numexpr version: %s' % numexpr.__version__)
+ print('NumPy version: %s' % np.__version__)
print('Python version: %s' % sys.version)
- if os.name == 'posix':
- (sysname, nodename, release, version, machine) = os.uname()
- print('Platform: %s-%s' % (sys.platform, machine))
- print("AMD/Intel CPU? %s" % numexpr.is_cpu_amd_intel)
- print("VML available? %s" % use_vml)
+ (sysname, nodename, release, os_version, machine, processor) =
platform.uname()
+ print('Platform: %s-%s-%s' % (sys.platform, machine, os_version))
+ try:
+ # cpuinfo doesn't work on OSX well it seems, so protect these outputs
+ # with a try block
+ cpu_info = cpu.info[0]
+ print('CPU vendor: %s' % cpu_info.get('VendorIdentifier', ''))
+ print('CPU model: %s' % cpu_info.get('ProcessorNameString',
''))
+ print('CPU clock speed: %s MHz' % cpu_info.get('~MHz',''))
+ except KeyError:
+ pass
+ print('VML available? %s' % use_vml)
if use_vml:
- print("VML/MKL version: %s" % numexpr.get_vml_version())
- print("Number of threads used by default: %d "
- "(out of %d detected cores)" % (numexpr.nthreads, numexpr.ncores))
+ print('VML/MKL version: %s' % numexpr.get_vml_version())
+ print('Number of threads used by default: %d '
+ '(out of %d detected cores)' % (numexpr.nthreads, numexpr.ncores))
+ print('Maximum number of threads: %s' % numexpr.MAX_THREADS)
print('-=' * 38)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/utils.py
new/numexpr-2.7.1/numexpr/utils.py
--- old/numexpr-2.6.4/numexpr/utils.py 2017-09-14 08:37:56.000000000 +0200
+++ new/numexpr-2.7.1/numexpr/utils.py 2019-01-28 20:33:20.000000000 +0100
@@ -8,10 +8,14 @@
# rights to use.
####################################################################
+import logging
+log = logging.getLogger(__name__)
+
import os
import subprocess
+import platform
-from numexpr.interpreter import _set_num_threads
+from numexpr.interpreter import _set_num_threads, MAX_THREADS
from numexpr import use_vml
if use_vml:
@@ -93,7 +97,54 @@
old_nthreads = _set_num_threads(nthreads)
return old_nthreads
+def _init_num_threads():
+ """
+ Detects the environment variable 'NUMEXPR_MAX_THREADS' to set the
threadpool
+ size, and if necessary the slightly redundant 'NUMEXPR_NUM_THREADS' or
+ 'OMP_NUM_THREADS' env vars to set the initial number of threads used by
+ the virtual machine.
+ """
+ # Any platform-specific short-circuits
+ if 'sparc' in platform.machine():
+ log.warning('The number of threads have been set to 1 because problems
related '
+ 'to threading have been reported on some sparc machine. '
+ 'The number of threads can be changed using the
"set_num_threads" '
+ 'function.')
+ set_num_threads(1)
+ return 1
+
+ env_configured = False
+ n_cores = detect_number_of_cores()
+ if 'NUMEXPR_MAX_THREADS' in os.environ:
+ # The user has configured NumExpr in the expected way, so suppress
logs.
+ env_configured = True
+ n_cores = MAX_THREADS
+ else:
+ # The use has not set 'NUMEXPR_MAX_THREADS', so likely they have not
+ # configured NumExpr as desired, so we emit info logs.
+ if n_cores > MAX_THREADS:
+ log.info('Note: detected %d virtual cores but NumExpr set to
maximum of %d, check "NUMEXPR_MAX_THREADS" environment variable.'%(n_cores,
MAX_THREADS))
+ if n_cores > 8:
+ # The historical 'safety' limit.
+ log.info('Note: NumExpr detected %d cores but
"NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8.'%n_cores)
+ n_cores = 8
+
+ # Now we check for 'NUMEXPR_NUM_THREADS' or 'OMP_NUM_THREADS' to set the
+ # actual number of threads used.
+ if 'NUMEXPR_NUM_THREADS' in os.environ:
+ requested_threads = int(os.environ['NUMEXPR_NUM_THREADS'])
+ elif 'OMP_NUM_THREADS' in os.environ:
+ requested_threads = int(os.environ['OMP_NUM_THREADS'])
+ else:
+ requested_threads = n_cores
+ if not env_configured:
+ log.info('NumExpr defaulting to %d threads.'%n_cores)
+
+ # The C-extension function performs its own checks against `MAX_THREADS`
+ set_num_threads(requested_threads)
+ return requested_threads
+
def detect_number_of_cores():
"""
Detects the number of cores on a system. Cribbed from pp.
@@ -108,28 +159,32 @@
else: # OSX:
return int(subprocess.check_output(["sysctl", "-n", "hw.ncpu"]))
# Windows:
- if os.environ.has_key("NUMBER_OF_PROCESSORS"):
- ncpus = int(os.environ["NUMBER_OF_PROCESSORS"]);
+ try:
+ ncpus = int(os.environ.get("NUMBER_OF_PROCESSORS", ""))
if ncpus > 0:
return ncpus
+ except ValueError:
+ pass
return 1 # Default
def detect_number_of_threads():
"""
+ DEPRECATED: use `_init_num_threads` instead.
If this is modified, please update the note in:
https://github.com/pydata/numexpr/wiki/Numexpr-Users-Guide
"""
+ log.warning('Deprecated, use `init_num_threads` instead.')
try:
- nthreads = int(os.environ['NUMEXPR_NUM_THREADS'])
- except KeyError:
- nthreads = int(os.environ.get('OMP_NUM_THREADS',
detect_number_of_cores()))
- # Check that we don't activate too many threads at the same time.
- # 8 seems a sensible value.
- if nthreads > 8:
- nthreads = 8
+ nthreads = int(os.environ.get('NUMEXPR_NUM_THREADS', ''))
+ except ValueError:
+ try:
+ nthreads = int(os.environ.get('OMP_NUM_THREADS', ''))
+ except ValueError:
+ nthreads = detect_number_of_cores()
+
# Check that we don't surpass the MAX_THREADS in interpreter.cpp
- if nthreads > 4096:
- nthreads = 4096
+ if nthreads > MAX_THREADS:
+ nthreads = MAX_THREADS
return nthreads
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr/version.py
new/numexpr-2.7.1/numexpr/version.py
--- old/numexpr-2.6.4/numexpr/version.py 2017-09-14 08:40:07.000000000
+0200
+++ new/numexpr-2.7.1/numexpr/version.py 2020-01-04 01:19:17.000000000
+0100
@@ -8,4 +8,4 @@
# rights to use.
####################################################################
-version = '2.6.4'
+version = '2.7.1'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/numexpr.egg-info/PKG-INFO
new/numexpr-2.7.1/numexpr.egg-info/PKG-INFO
--- old/numexpr-2.6.4/numexpr.egg-info/PKG-INFO 2017-09-14 08:46:26.000000000
+0200
+++ new/numexpr-2.7.1/numexpr.egg-info/PKG-INFO 2020-01-05 20:07:23.000000000
+0100
@@ -1,11 +1,132 @@
Metadata-Version: 1.0
Name: numexpr
-Version: 2.6.4
+Version: 2.7.1
Summary: Fast numerical expression evaluator for NumPy
Home-page: https://github.com/pydata/numexpr
Author: David M. Cooke, Francesc Alted and others
Author-email: [email protected], [email protected]
License: MIT
-Description-Content-Type: UNKNOWN
-Description: UNKNOWN
+Description: ======================================================
+ NumExpr: Fast numerical expression evaluator for NumPy
+ ======================================================
+
+ :Author: David M. Cooke, Francesc Alted and others
+ :Contact: [email protected]
+ :URL: https://github.com/pydata/numexpr
+ :Documentation: http://numexpr.readthedocs.io/en/latest/
+ :Travis CI: |travis|
+ :Appveyor: |appveyor|
+ :PyPi: |version|
+ :DOI: |doi|
+ :readthedocs: |docs|
+
+ .. |travis| image::
https://travis-ci.org/pydata/numexpr.png?branch=master
+ :target: https://travis-ci.org/pydata/numexpr
+ .. |appveyor| image::
https://ci.appveyor.com/api/projects/status/we2ff01vqlmlb9ip
+ :target: https://ci.appveyor.com/project/robbmcleod/numexpr
+ .. |docs| image::
https://readthedocs.org/projects/numexpr/badge/?version=latest
+ :target: http://numexpr.readthedocs.io/en/latest
+ .. |doi| image::
https://zenodo.org/badge/doi/10.5281/zenodo.2483274.svg
+ :target: https://doi.org/10.5281/zenodo.2483274
+ .. |version| image:: https://img.shields.io/pypi/v/numexpr.png
+ :target: https://pypi.python.org/pypi/numexpr
+
+
+ What is NumExpr?
+ ----------------
+
+ NumExpr is a fast numerical expression evaluator for NumPy. With it,
+ expressions that operate on arrays (like :code:`'3*a+4*b'`) are
accelerated
+ and use less memory than doing the same calculation in Python.
+
+ In addition, its multi-threaded capabilities can make use of all your
+ cores -- which generally results in substantial performance scaling
compared
+ to NumPy.
+
+ Last but not least, numexpr can make use of Intel's VML (Vector Math
+ Library, normally integrated in its Math Kernel Library, or MKL).
+ This allows further acceleration of transcendent expressions.
+
+
+ How NumExpr achieves high performance
+ -------------------------------------
+
+ The main reason why NumExpr achieves better performance than NumPy is
+ that it avoids allocating memory for intermediate results. This
+ results in better cache utilization and reduces memory access in
+ general. Due to this, NumExpr works best with large arrays.
+
+ NumExpr parses expressions into its own op-codes that are then used by
+ an integrated computing virtual machine. The array operands are split
+ into small chunks that easily fit in the cache of the CPU and passed
+ to the virtual machine. The virtual machine then applies the
+ operations on each chunk. It's worth noting that all temporaries and
+ constants in the expression are also chunked. Chunks are distributed
among
+ the available cores of the CPU, resulting in highly parallelized code
+ execution.
+
+ The result is that NumExpr can get the most of your machine computing
+ capabilities for array-wise computations. Common speed-ups with regard
+ to NumPy are usually between 0.95x (for very simple expressions like
+ :code:`'a + 1'`) and 4x (for relatively complex ones like
:code:`'a*b-4.1*a >
+ 2.5*b'`), although much higher speed-ups can be achieved for some
functions
+ and complex math operations (up to 15x in some cases).
+
+ NumExpr performs best on matrices that are too large to fit in L1 CPU
cache.
+ In order to get a better idea on the different speed-ups that can be
achieved
+ on your platform, run the provided benchmarks.
+
+
+ Usage
+ -----
+
+ ::
+
+ >>> import numpy as np
+ >>> import numexpr as ne
+
+ >>> a = np.arange(1e6) # Choose large arrays for better speedups
+ >>> b = np.arange(1e6)
+
+ >>> ne.evaluate("a + 1") # a simple expression
+ array([ 1.00000000e+00, 2.00000000e+00, 3.00000000e+00, ...,
+ 9.99998000e+05, 9.99999000e+05, 1.00000000e+06])
+
+ >>> ne.evaluate('a*b-4.1*a > 2.5*b') # a more complex one
+ array([False, False, False, ..., True, True, True], dtype=bool)
+
+ >>> ne.evaluate("sin(a) + arcsinh(a/b)") # you can also use
functions
+ array([ NaN, 1.72284457, 1.79067101, ..., 1.09567006,
+ 0.17523598, -0.09597844])
+
+ >>> s = np.array(['abba', 'abbb', 'abbcdef'])
+ >>> ne.evaluate("'abba' == s") # string arrays are supported too
+ array([ True, False, False], dtype=bool)
+
+
+ Documentation
+ -------------
+
+ Please see the official documentation at `numexpr.readthedocs.io
<https://numexpr.readthedocs.io>`_.
+ Included is a user guide, benchmark results, and the reference API.
+
+
+ Authors
+ -------
+
+ Please see `AUTHORS.txt
<https://github.com/pydata/numexpr/blob/master/AUTHORS.txt>`_.
+
+
+ License
+ -------
+
+ NumExpr is distributed under the `MIT
<http://www.opensource.org/licenses/mit-license.php>`_ license.
+
+
+ .. Local Variables:
+ .. mode: text
+ .. coding: utf-8
+ .. fill-column: 70
+ .. End:
+
Platform: UNKNOWN
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/requirements.txt
new/numexpr-2.7.1/requirements.txt
--- old/numexpr-2.6.4/requirements.txt 2017-09-14 08:37:56.000000000 +0200
+++ new/numexpr-2.7.1/requirements.txt 2019-12-24 19:48:54.000000000 +0100
@@ -1,2 +1 @@
-numpy>=1.7
-
+numpy>=1.7
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/setup.py new/numexpr-2.7.1/setup.py
--- old/numexpr-2.6.4/setup.py 2017-09-14 08:37:56.000000000 +0200
+++ new/numexpr-2.7.1/setup.py 2019-12-24 19:49:40.000000000 +0100
@@ -10,12 +10,9 @@
####################################################################
import shutil
-import os
-import sys
-import os.path as op
+import sys, os, os.path as op, io
from distutils.command.clean import clean
-
if sys.version_info < (2, 6):
raise RuntimeError("must use python 2.6 or greater")
@@ -27,6 +24,9 @@
with open('requirements.txt') as f:
requirements = f.read().splitlines()
+with io.open('README.rst', encoding='utf-8') as f:
+ LONG_DESCRIPTION = f.read()
+
# Fetch the version for numexpr (will be put in variable `version`)
with open(os.path.join('numexpr', 'version.py')) as f:
exec(f.read())
@@ -37,6 +37,7 @@
author='David M. Cooke, Francesc Alted and others',
author_email='[email protected], [email protected]',
url='https://github.com/pydata/numexpr',
+ long_description=LONG_DESCRIPTION,
license='MIT',
packages=['numexpr'],
install_requires=requirements,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/numexpr-2.6.4/site.cfg.example
new/numexpr-2.7.1/site.cfg.example
--- old/numexpr-2.6.4/site.cfg.example 2017-09-14 08:38:25.000000000 +0200
+++ new/numexpr-2.7.1/site.cfg.example 2019-12-17 00:40:39.000000000 +0100
@@ -13,18 +13,18 @@
[DEFAULT]
#libraries = gfortran
-[mkl]
+#[mkl]
# Example for the MKL included in Intel C 11.0 compiler
# (you may need a recent NumPy version for being able to search libraries
# in different directories at a time)
#library_dirs =
/opt/intel/Compiler/11.0/074/mkl/lib/em64t/:/opt/intel/Compiler/11.0/074/lib/intel64
#include_dirs = /opt/intel/Compiler/11.0/074/mkl/include/
-#mkl_libs = mkl_solver_ilp64, mkl_intel_ilp64, mkl_intel_thread, mkl_core,
iomp5
+#libraries = mkl_solver_ilp64, mkl_intel_ilp64, mkl_intel_thread, mkl_core,
iomp5
# This seems to work for MKL 11 with processors with AVX (Sandy Bridge and
above) for Linux
#library_dirs =
/opt/intel/composerxe/mkl/lib/intel64:/opt/intel/composer_xe_2013.3.163/compiler/lib/intel64
#include_dirs = /opt/intel/composerxe/mkl/include/
-#mkl_libs = mkl_intel_lp64, mkl_gf_lp64, mkl_intel_thread, mkl_core,
mkl_blas95_lp64, mkl_lapack95_lp64, mkl_avx, mkl_vml_avx, mkl_rt, iomp5
+#libraries = mkl_intel_lp64, mkl_gf_lp64, mkl_intel_thread, mkl_core,
mkl_blas95_lp64, mkl_lapack95_lp64, mkl_avx, mkl_vml_avx, mkl_rt, iomp5
## Example for using MKL 10.0
#library_dirs = /opt/intel/mkl/10.0.2.018/lib/em64t
@@ -33,19 +33,20 @@
# Example for using MKL 10.2 for Windows 64-bit
#include_dirs = \Program Files\Intel\MKL\10.2.5.035\include
#library_dirs = \Program Files\Intel\MKL\10.2.5.035\em64t\lib
-#mkl_libs = mkl_solver_ilp64, mkl_core, mkl_intel_thread, mkl_intel_ilp64,
libiomp5md
+#libraries = mkl_solver_ilp64, mkl_core, mkl_intel_thread, mkl_intel_ilp64,
libiomp5md
# The next works too, but for LP64 arithmetic
-#mkl_libs = mkl_core, mkl_intel_thread, mkl_intel_lp64, libiomp5md
+#libraries = mkl_core, mkl_intel_thread, mkl_intel_lp64, libiomp5md
# Example with Intel compiler version 14.0.2 and MKL v11.1.2 on intel64
architecture
-#mkl_libs = mkl_intel_lp64, mkl_gf_lp64, mkl_intel_thread, mkl_core, mkl_def,
mkl_vml_avx, mkl_rt, iomp5
+#libraries = mkl_intel_lp64, mkl_gf_lp64, mkl_intel_thread, mkl_core, mkl_def,
mkl_vml_avx, mkl_rt, iomp5
# For details, see https://github.com/pydata/numexpr/issues/148
# Example for MKL2018 on Windows x64
#
https://software.intel.com/en-us/articles/building-numpyscipy-with-intel-mkl-and-intel-fortran-on-windows
# Please note that the valid os.pathsep is ';' on Windows and ':' on Linux
# and that numpy.distutils.system_info only accepts the first instance of
library_dirs
+# Last make sure you do `python setup.py install` instead of using pip.
[mkl]
-library_dirs=/Program Files
(x86)/IntelSWTools/compilers_and_libraries_2018.0.124/windows/mkl/lib/intel64;/Program
Files
(x86)/IntelSWTools/compilers_and_libraries_2018.0.124/windows/compiler/lib/intel64_win
-include_dirs=/Program Files
(x86)/IntelSWTools/compilers_and_libraries_2018.0.124/windows/mkl/include
-mkl_libs = mkl_intel_lp64, mkl_intel_thread, mkl_core, libiomp5md
\ No newline at end of file
+library_dirs=/Program Files
(x86)/IntelSWTools/compilers_and_libraries/windows/mkl/lib/intel64;/Program
Files (x86)/IntelSWTools/compilers_and_libraries/windows/compiler/lib/intel64
+include_dirs=/Program Files
(x86)/IntelSWTools/compilers_and_libraries/windows/mkl/include
+libraries = mkl_intel_lp64, mkl_intel_thread, mkl_core, libiomp5md
\ No newline at end of file