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


Reply via email to