Hello community, here is the log from the commit of package python-Bottleneck for openSUSE:Factory checked in at 2017-10-09 19:41:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-Bottleneck (Old) and /work/SRC/openSUSE:Factory/.python-Bottleneck.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-Bottleneck" Mon Oct 9 19:41:08 2017 rev:6 rq:530454 version:1.2.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-Bottleneck/python-Bottleneck.changes 2017-05-03 15:54:51.220016869 +0200 +++ /work/SRC/openSUSE:Factory/.python-Bottleneck.new/python-Bottleneck.changes 2017-10-09 19:41:10.538163494 +0200 @@ -1,0 +2,13 @@ +Wed Sep 27 22:20:10 UTC 2017 - [email protected] + +- update to version 1.2.1: + * #156 Installing bottleneck when two versions of NumPy are present + * #157 Compiling on Ubuntu 14.04 inside a Windows 7 WMware + * #159 Occasional segmentation fault in nanargmin, nanargmax, + median, and nanmedian when all of the following conditions are + met: axis is None, input array is 2d or greater, and input array + is not C contiguous. + * #163 Reducing np.array([2**31], dtype=np.int64) overflows on + Windows + +------------------------------------------------------------------- Old: ---- Bottleneck-1.2.0.tar.gz New: ---- Bottleneck-1.2.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-Bottleneck.spec ++++++ --- /var/tmp/diff_new_pack.2u3Zmv/_old 2017-10-09 19:41:11.106138531 +0200 +++ /var/tmp/diff_new_pack.2u3Zmv/_new 2017-10-09 19:41:11.106138531 +0200 @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-Bottleneck -Version: 1.2.0 +Version: 1.2.1 Release: 0 Summary: A collection of fast NumPy array functions License: BSD-2-Clause and BSD-3-Clause @@ -26,11 +26,11 @@ Url: http://berkeleyanalytics.com/bottleneck/ Source0: https://files.pythonhosted.org/packages/source/B/Bottleneck/Bottleneck-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-build -BuildRequires: fdupes -BuildRequires: python-rpm-macros BuildRequires: %{python_module devel} -BuildRequires: %{python_module setuptools} BuildRequires: %{python_module numpy-devel >= 1.9.1} +BuildRequires: %{python_module setuptools} +BuildRequires: fdupes +BuildRequires: python-rpm-macros Requires: python-numpy >= 1.9.1 %python_subpackages ++++++ Bottleneck-1.2.0.tar.gz -> Bottleneck-1.2.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/Bottleneck.egg-info/PKG-INFO new/Bottleneck-1.2.1/Bottleneck.egg-info/PKG-INFO --- old/Bottleneck-1.2.0/Bottleneck.egg-info/PKG-INFO 2016-10-20 20:48:43.000000000 +0200 +++ new/Bottleneck-1.2.1/Bottleneck.egg-info/PKG-INFO 2017-05-15 18:49:14.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Bottleneck -Version: 1.2.0 +Version: 1.2.1 Summary: Fast NumPy array functions written in C Home-page: https://github.com/kwgoodman/bottleneck Author: Keith Goodman @@ -32,41 +32,42 @@ >>> bn.bench() Bottleneck performance benchmark - Bottleneck 1.2.0; Numpy 1.11.2 + Bottleneck 1.3.0.dev0; Numpy 1.12.1 Speed is NumPy time divided by Bottleneck time - NaN means approx one-fifth NaNs; float64 and axis=-1 are used + NaN means approx one-fifth NaNs; float64 used - no NaN NaN no NaN NaN - (100,) (1000,) (1000,1000)(1000,1000) - nansum 58.3 16.6 2.3 5.1 - nanmean 258.7 46.1 3.5 5.1 - nanstd 238.4 42.9 2.8 5.0 - nanvar 229.9 41.4 2.7 5.0 - nanmin 44.6 12.9 0.8 0.9 - nanmax 41.8 12.9 0.8 1.8 - median 99.6 51.4 1.1 5.7 - nanmedian 102.1 26.5 5.0 31.2 - ss 27.4 6.4 1.6 1.6 - nanargmin 72.6 24.6 2.3 3.4 - nanargmax 70.1 29.2 2.4 4.6 - anynan 22.1 49.9 0.5 114.6 - allnan 43.3 48.4 115.8 66.7 - rankdata 50.3 8.0 2.6 6.5 - nanrankdata 52.5 8.1 2.9 6.8 - partition 4.1 3.6 1.0 2.0 - argpartition 2.7 2.2 1.1 1.5 - replace 13.7 4.9 1.5 1.5 - push 3231.6 7437.4 20.1 19.6 - move_sum 4173.5 8955.4 194.7 374.8 - move_mean 10265.5 18540.0 222.8 372.2 - move_std 8910.9 12158.5 128.7 234.5 - move_var 11969.4 18323.8 202.7 378.7 - move_min 2164.6 3676.3 23.9 57.2 - move_max 1995.0 4206.0 23.8 108.8 - move_argmin 3380.5 5559.1 40.5 180.5 - move_argmax 3386.5 7278.1 43.0 227.2 - move_median 1762.3 1134.9 157.9 118.5 - move_rank 1203.6 223.2 2.7 7.8 + no NaN no NaN NaN no NaN NaN + (100,) (1000,1000)(1000,1000)(1000,1000)(1000,1000) + axis=0 axis=0 axis=0 axis=1 axis=1 + nansum 67.3 0.3 0.7 2.5 2.4 + nanmean 194.8 1.9 2.1 3.4 3.1 + nanstd 241.5 1.6 2.1 2.7 2.6 + nanvar 229.7 1.7 2.1 2.7 2.5 + nanmin 34.1 0.7 1.1 0.8 2.6 + nanmax 45.6 0.7 2.7 1.0 3.7 + median 111.0 1.3 5.6 1.0 4.8 + nanmedian 108.8 5.9 6.7 5.6 6.7 + ss 16.3 1.1 1.2 1.6 1.6 + nanargmin 89.2 2.9 5.1 2.2 5.6 + nanargmax 107.4 3.0 5.4 2.2 5.8 + anynan 19.4 0.3 35.0 0.5 29.9 + allnan 39.9 146.6 128.3 115.8 75.6 + rankdata 55.0 2.6 2.3 2.9 2.8 + nanrankdata 59.8 2.8 2.2 3.2 2.5 + partition 4.4 1.2 1.6 1.0 1.4 + argpartition 3.5 1.1 1.4 1.1 1.6 + replace 17.7 1.4 1.4 1.3 1.4 + push 3440.0 7.8 9.5 20.0 15.5 + move_sum 4743.0 75.7 156.1 195.4 211.1 + move_mean 8760.9 116.2 167.4 252.1 258.8 + move_std 8979.9 96.1 196.3 144.0 256.3 + move_var 11216.8 127.3 243.9 225.9 321.4 + move_min 2245.3 20.6 36.7 23.2 42.1 + move_max 2223.7 20.5 37.2 24.1 42.4 + move_argmin 3664.0 48.2 73.3 40.2 83.9 + move_argmax 3916.9 42.0 75.4 41.5 81.2 + move_median 2023.3 166.8 173.7 153.8 154.3 + move_rank 1208.5 1.9 1.9 2.5 2.8 You can also run a detailed benchmark for a single function using, for example, the command:: @@ -101,7 +102,7 @@ Requirements: ======================== ==================================================== - Bottleneck Python 2.7, 3.4, 3.5; NumPy 1.11.2 + Bottleneck Python 2.7, 3.5, 3.6; NumPy 1.12.1 Compile gcc, clang, MinGW or MSVC Unit tests nose ======================== ==================================================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/Bottleneck.egg-info/SOURCES.txt new/Bottleneck-1.2.1/Bottleneck.egg-info/SOURCES.txt --- old/Bottleneck-1.2.0/Bottleneck.egg-info/SOURCES.txt 2016-10-20 20:48:43.000000000 +0200 +++ new/Bottleneck-1.2.1/Bottleneck.egg-info/SOURCES.txt 2017-05-15 18:49:14.000000000 +0200 @@ -61,8 +61,11 @@ doc/sphinxext/comment_eater.py doc/sphinxext/compiler_unparse.py doc/sphinxext/docscrape.py +doc/sphinxext/docscrape.pyc doc/sphinxext/docscrape_sphinx.py +doc/sphinxext/docscrape_sphinx.pyc doc/sphinxext/numpydoc.py +doc/sphinxext/numpydoc.pyc doc/sphinxext/phantom_import.py doc/sphinxext/plot_directive.py doc/sphinxext/setup.cfg diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/Bottleneck.egg-info/requires.txt new/Bottleneck-1.2.1/Bottleneck.egg-info/requires.txt --- old/Bottleneck-1.2.0/Bottleneck.egg-info/requires.txt 2016-10-20 20:48:43.000000000 +0200 +++ new/Bottleneck-1.2.1/Bottleneck.egg-info/requires.txt 2017-05-15 18:49:14.000000000 +0200 @@ -1 +1 @@ -numpy \ No newline at end of file +numpy diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/Makefile new/Bottleneck-1.2.1/Makefile --- old/Bottleneck-1.2.0/Makefile 2016-10-17 18:27:09.000000000 +0200 +++ new/Bottleneck-1.2.1/Makefile 2017-05-05 23:24:40.000000000 +0200 @@ -27,7 +27,7 @@ ${PYTHON} -c "import bottleneck;bottleneck.test()" flake8: - flake8 --exclude=doc . + flake8 --exclude=doc,.tox . readme: PYTHONPATH=`pwd`:PYTHONPATH ${PYTHON} tools/update_readme.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/PKG-INFO new/Bottleneck-1.2.1/PKG-INFO --- old/Bottleneck-1.2.0/PKG-INFO 2016-10-20 20:48:43.000000000 +0200 +++ new/Bottleneck-1.2.1/PKG-INFO 2017-05-15 18:49:14.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Bottleneck -Version: 1.2.0 +Version: 1.2.1 Summary: Fast NumPy array functions written in C Home-page: https://github.com/kwgoodman/bottleneck Author: Keith Goodman @@ -32,41 +32,42 @@ >>> bn.bench() Bottleneck performance benchmark - Bottleneck 1.2.0; Numpy 1.11.2 + Bottleneck 1.3.0.dev0; Numpy 1.12.1 Speed is NumPy time divided by Bottleneck time - NaN means approx one-fifth NaNs; float64 and axis=-1 are used + NaN means approx one-fifth NaNs; float64 used - no NaN NaN no NaN NaN - (100,) (1000,) (1000,1000)(1000,1000) - nansum 58.3 16.6 2.3 5.1 - nanmean 258.7 46.1 3.5 5.1 - nanstd 238.4 42.9 2.8 5.0 - nanvar 229.9 41.4 2.7 5.0 - nanmin 44.6 12.9 0.8 0.9 - nanmax 41.8 12.9 0.8 1.8 - median 99.6 51.4 1.1 5.7 - nanmedian 102.1 26.5 5.0 31.2 - ss 27.4 6.4 1.6 1.6 - nanargmin 72.6 24.6 2.3 3.4 - nanargmax 70.1 29.2 2.4 4.6 - anynan 22.1 49.9 0.5 114.6 - allnan 43.3 48.4 115.8 66.7 - rankdata 50.3 8.0 2.6 6.5 - nanrankdata 52.5 8.1 2.9 6.8 - partition 4.1 3.6 1.0 2.0 - argpartition 2.7 2.2 1.1 1.5 - replace 13.7 4.9 1.5 1.5 - push 3231.6 7437.4 20.1 19.6 - move_sum 4173.5 8955.4 194.7 374.8 - move_mean 10265.5 18540.0 222.8 372.2 - move_std 8910.9 12158.5 128.7 234.5 - move_var 11969.4 18323.8 202.7 378.7 - move_min 2164.6 3676.3 23.9 57.2 - move_max 1995.0 4206.0 23.8 108.8 - move_argmin 3380.5 5559.1 40.5 180.5 - move_argmax 3386.5 7278.1 43.0 227.2 - move_median 1762.3 1134.9 157.9 118.5 - move_rank 1203.6 223.2 2.7 7.8 + no NaN no NaN NaN no NaN NaN + (100,) (1000,1000)(1000,1000)(1000,1000)(1000,1000) + axis=0 axis=0 axis=0 axis=1 axis=1 + nansum 67.3 0.3 0.7 2.5 2.4 + nanmean 194.8 1.9 2.1 3.4 3.1 + nanstd 241.5 1.6 2.1 2.7 2.6 + nanvar 229.7 1.7 2.1 2.7 2.5 + nanmin 34.1 0.7 1.1 0.8 2.6 + nanmax 45.6 0.7 2.7 1.0 3.7 + median 111.0 1.3 5.6 1.0 4.8 + nanmedian 108.8 5.9 6.7 5.6 6.7 + ss 16.3 1.1 1.2 1.6 1.6 + nanargmin 89.2 2.9 5.1 2.2 5.6 + nanargmax 107.4 3.0 5.4 2.2 5.8 + anynan 19.4 0.3 35.0 0.5 29.9 + allnan 39.9 146.6 128.3 115.8 75.6 + rankdata 55.0 2.6 2.3 2.9 2.8 + nanrankdata 59.8 2.8 2.2 3.2 2.5 + partition 4.4 1.2 1.6 1.0 1.4 + argpartition 3.5 1.1 1.4 1.1 1.6 + replace 17.7 1.4 1.4 1.3 1.4 + push 3440.0 7.8 9.5 20.0 15.5 + move_sum 4743.0 75.7 156.1 195.4 211.1 + move_mean 8760.9 116.2 167.4 252.1 258.8 + move_std 8979.9 96.1 196.3 144.0 256.3 + move_var 11216.8 127.3 243.9 225.9 321.4 + move_min 2245.3 20.6 36.7 23.2 42.1 + move_max 2223.7 20.5 37.2 24.1 42.4 + move_argmin 3664.0 48.2 73.3 40.2 83.9 + move_argmax 3916.9 42.0 75.4 41.5 81.2 + move_median 2023.3 166.8 173.7 153.8 154.3 + move_rank 1208.5 1.9 1.9 2.5 2.8 You can also run a detailed benchmark for a single function using, for example, the command:: @@ -101,7 +102,7 @@ Requirements: ======================== ==================================================== - Bottleneck Python 2.7, 3.4, 3.5; NumPy 1.11.2 + Bottleneck Python 2.7, 3.5, 3.6; NumPy 1.12.1 Compile gcc, clang, MinGW or MSVC Unit tests nose ======================== ==================================================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/README.rst new/Bottleneck-1.2.1/README.rst --- old/Bottleneck-1.2.0/README.rst 2016-10-20 18:08:38.000000000 +0200 +++ new/Bottleneck-1.2.1/README.rst 2017-05-05 23:24:40.000000000 +0200 @@ -31,41 +31,42 @@ >>> bn.bench() Bottleneck performance benchmark - Bottleneck 1.2.0; Numpy 1.11.2 + Bottleneck 1.3.0.dev0; Numpy 1.12.1 Speed is NumPy time divided by Bottleneck time - NaN means approx one-fifth NaNs; float64 and axis=-1 are used + NaN means approx one-fifth NaNs; float64 used - no NaN NaN no NaN NaN - (100,) (1000,) (1000,1000)(1000,1000) - nansum 58.3 16.6 2.3 5.1 - nanmean 258.7 46.1 3.5 5.1 - nanstd 238.4 42.9 2.8 5.0 - nanvar 229.9 41.4 2.7 5.0 - nanmin 44.6 12.9 0.8 0.9 - nanmax 41.8 12.9 0.8 1.8 - median 99.6 51.4 1.1 5.7 - nanmedian 102.1 26.5 5.0 31.2 - ss 27.4 6.4 1.6 1.6 - nanargmin 72.6 24.6 2.3 3.4 - nanargmax 70.1 29.2 2.4 4.6 - anynan 22.1 49.9 0.5 114.6 - allnan 43.3 48.4 115.8 66.7 - rankdata 50.3 8.0 2.6 6.5 - nanrankdata 52.5 8.1 2.9 6.8 - partition 4.1 3.6 1.0 2.0 - argpartition 2.7 2.2 1.1 1.5 - replace 13.7 4.9 1.5 1.5 - push 3231.6 7437.4 20.1 19.6 - move_sum 4173.5 8955.4 194.7 374.8 - move_mean 10265.5 18540.0 222.8 372.2 - move_std 8910.9 12158.5 128.7 234.5 - move_var 11969.4 18323.8 202.7 378.7 - move_min 2164.6 3676.3 23.9 57.2 - move_max 1995.0 4206.0 23.8 108.8 - move_argmin 3380.5 5559.1 40.5 180.5 - move_argmax 3386.5 7278.1 43.0 227.2 - move_median 1762.3 1134.9 157.9 118.5 - move_rank 1203.6 223.2 2.7 7.8 + no NaN no NaN NaN no NaN NaN + (100,) (1000,1000)(1000,1000)(1000,1000)(1000,1000) + axis=0 axis=0 axis=0 axis=1 axis=1 + nansum 67.3 0.3 0.7 2.5 2.4 + nanmean 194.8 1.9 2.1 3.4 3.1 + nanstd 241.5 1.6 2.1 2.7 2.6 + nanvar 229.7 1.7 2.1 2.7 2.5 + nanmin 34.1 0.7 1.1 0.8 2.6 + nanmax 45.6 0.7 2.7 1.0 3.7 + median 111.0 1.3 5.6 1.0 4.8 + nanmedian 108.8 5.9 6.7 5.6 6.7 + ss 16.3 1.1 1.2 1.6 1.6 + nanargmin 89.2 2.9 5.1 2.2 5.6 + nanargmax 107.4 3.0 5.4 2.2 5.8 + anynan 19.4 0.3 35.0 0.5 29.9 + allnan 39.9 146.6 128.3 115.8 75.6 + rankdata 55.0 2.6 2.3 2.9 2.8 + nanrankdata 59.8 2.8 2.2 3.2 2.5 + partition 4.4 1.2 1.6 1.0 1.4 + argpartition 3.5 1.1 1.4 1.1 1.6 + replace 17.7 1.4 1.4 1.3 1.4 + push 3440.0 7.8 9.5 20.0 15.5 + move_sum 4743.0 75.7 156.1 195.4 211.1 + move_mean 8760.9 116.2 167.4 252.1 258.8 + move_std 8979.9 96.1 196.3 144.0 256.3 + move_var 11216.8 127.3 243.9 225.9 321.4 + move_min 2245.3 20.6 36.7 23.2 42.1 + move_max 2223.7 20.5 37.2 24.1 42.4 + move_argmin 3664.0 48.2 73.3 40.2 83.9 + move_argmax 3916.9 42.0 75.4 41.5 81.2 + move_median 2023.3 166.8 173.7 153.8 154.3 + move_rank 1208.5 1.9 1.9 2.5 2.8 You can also run a detailed benchmark for a single function using, for example, the command:: @@ -100,7 +101,7 @@ Requirements: ======================== ==================================================== -Bottleneck Python 2.7, 3.4, 3.5; NumPy 1.11.2 +Bottleneck Python 2.7, 3.5, 3.6; NumPy 1.12.1 Compile gcc, clang, MinGW or MSVC Unit tests nose ======================== ==================================================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/RELEASE.rst new/Bottleneck-1.2.1/RELEASE.rst --- old/Bottleneck-1.2.0/RELEASE.rst 2016-10-20 18:09:20.000000000 +0200 +++ new/Bottleneck-1.2.1/RELEASE.rst 2017-05-15 18:12:13.000000000 +0200 @@ -6,9 +6,32 @@ These are the major changes made in each release. For details of the changes see the commit log at http://github.com/kwgoodman/bottleneck -Bottleneck 1.2.0 +Bottleneck 1.2.1 ================ +*Release date: 2017-05-15* + +This release adds support for NumPy's relaxed strides checking and +fixes a few bugs. + +**Bug Fixes** + +- #156 Installing bottleneck when two versions of NumPy are present +- #157 Compiling on Ubuntu 14.04 inside a Windows 7 WMware +- #159 Occasional segmentation fault in nanargmin, nanargmax, median, + and nanmedian when all of the following conditions are met: + axis is None, input array is 2d or greater, and input array is not C + contiguous. +- #163 Reducing np.array([2**31], dtype=np.int64) overflows on Windows + +Older versions +============== + +Release notes from past releases. + +Bottleneck 1.2.0 +---------------- + *Release date: 2016-10-20* This release is a complete rewrite of Bottleneck. @@ -51,11 +74,6 @@ - A special thanks to the Cython developers. The quickest way to appreciate their work is to remove Cython from your project. It is not easy. -Older versions -============== - -Release notes from past releases. - Bottleneck 1.1.0 ---------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/LICENSE new/Bottleneck-1.2.1/bottleneck/LICENSE --- old/Bottleneck-1.2.0/bottleneck/LICENSE 2016-10-13 18:52:06.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/LICENSE 2017-05-05 23:24:40.000000000 +0200 @@ -9,7 +9,7 @@ Bottleneck license ================== -Copyright (c) 2010-2016 Keith Goodman +Copyright (c) 2010-2017 Keith Goodman All rights reserved. Redistribution and use in source and binary forms, with or without diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/benchmark/bench.py new/Bottleneck-1.2.1/bottleneck/benchmark/bench.py --- old/Bottleneck-1.2.0/bottleneck/benchmark/bench.py 2016-10-13 18:52:06.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/benchmark/bench.py 2017-05-05 23:24:40.000000000 +0200 @@ -6,9 +6,11 @@ __all__ = ['bench'] -def bench(dtype='float64', axis=-1, - shapes=[(100,), (1000,), (1000, 1000), (1000, 1000)], - nans=[False, True, False, True], +def bench(shapes=[(100,), (1000, 1000), (1000, 1000), (1000, 1000), + (1000, 1000)], + axes=[0, 0, 0, 1, 1], + nans=[False, False, True, False, True], + dtype='float64', order='C', functions=None): """ @@ -16,17 +18,17 @@ Parameters ---------- - dtype : str, optional - Data type string such as 'float64', which is the default. - axis : int, optional - Axis along which to perform the calculations that are being - benchmarked. The default is the last axis (axis=-1). shapes : list, optional A list of tuple shapes of input arrays to use in the benchmark. + axes : list, optional + List of axes along which to perform the calculations that are being + benchmarked. nans : list, optional A list of the bools (True or False), one for each tuple in the `shapes` list, that tells whether the input arrays should be randomly filled with one-fifth NaNs. + dtype : str, optional + Data type string such as 'float64', which is the default. order : {'C', 'F'}, optional Whether to store multidimensional data in C- or Fortran-contiguous (row- or column-wise) order in memory. @@ -43,21 +45,17 @@ if len(shapes) != len(nans): raise ValueError("`shapes` and `nans` must have the same length") - - dtype = str(dtype) - axis = str(axis) - - tab = ' ' + if len(shapes) != len(axes): + raise ValueError("`shapes` and `axes` must have the same length") # Header print('Bottleneck performance benchmark') - print("%sBottleneck %s; Numpy %s" % (tab, bn.__version__, np.__version__)) - print("%sSpeed is NumPy time divided by Bottleneck time" % tab) - tup = (tab, dtype, axis) - print("%sNaN means approx one-fifth NaNs; %s and axis=%s are used" % tup) + print(" Bottleneck %s; Numpy %s" % (bn.__version__, np.__version__)) + print(" Speed is NumPy time divided by Bottleneck time") + print(" NaN means approx one-fifth NaNs; %s used" % str(dtype)) print('') - header = [" "*15] + header = [" "*11] for nan in nans: if nan: header.append("NaN".center(11)) @@ -65,13 +63,17 @@ header.append("no NaN".center(11)) print("".join(header)) header = ["".join(str(shape).split(" ")).center(11) for shape in shapes] - header = [" "*16] + header + header = [" "*12] + header + print("".join(header)) + header = ["".join(("axis=" + str(axis)).split(" ")).center(11) + for axis in axes] + header = [" "*12] + header print("".join(header)) - suite = benchsuite(shapes, dtype, axis, nans, order, functions) + suite = benchsuite(shapes, dtype, nans, axes, order, functions) for test in suite: name = test["name"].ljust(12) - fmt = tab + name + "%7.1f" + "%11.1f"*(len(shapes) - 1) + fmt = name + "%7.1f" + "%11.1f"*(len(shapes) - 1) speed = timer(test['statements'], test['setups']) print(fmt % tuple(speed)) @@ -88,28 +90,31 @@ return speed -def getarray(shape, dtype, nans=False, order='C'): +def getarray(shape, dtype, nans, order): a = np.arange(np.prod(shape), dtype=dtype) if nans and issubclass(a.dtype.type, np.inexact): a[::5] = np.nan - else: - rs = np.random.RandomState(shape) - rs.shuffle(a) + rs = np.random.RandomState(shape) + rs.shuffle(a) return np.array(a.reshape(*shape), order=order) -def benchsuite(shapes, dtype, axis, nans, order, functions): +def benchsuite(shapes, dtype, nans, axes, order, functions): suite = [] - def getsetups(setup, shapes, nans, order): + def getsetups(setup, shapes, nans, axes, dtype, order): template = """ from bottleneck.benchmark.bench import getarray - a = getarray(%s, 'DTYPE', %s, '%s') + a = getarray(%s, '%s', %s, '%s') + axis=%s %s""" setups = [] - for shape, nan in zip(shapes, nans): - setups.append(template % (str(shape), str(nan), order, setup)) + for shape, axis, nan in zip(shapes, axes, nans): + s = template % (str(shape), str(dtype), str(nan), str(order), + str(axis), setup) + s = '\n'.join([line.strip() for line in s.split('\n')]) + setups.append(s) return setups # non-moving window functions @@ -120,14 +125,14 @@ continue run = {} run['name'] = func - run['statements'] = ["bn_func(a, AXIS)", "sl_func(a, AXIS)"] + run['statements'] = ["bn_func(a, axis)", "sl_func(a, axis)"] setup = """ from bottleneck import %s as bn_func try: from numpy import %s as sl_func except ImportError: from bottleneck.slow import %s as sl_func if "%s" == "median": from bottleneck.slow import median as sl_func """ % (func, func, func, func) - run['setups'] = getsetups(setup, shapes, nans, order) + run['setups'] = getsetups(setup, shapes, nans, axes, dtype, order) suite.append(run) # partition, argpartition @@ -137,16 +142,16 @@ continue run = {} run['name'] = func - run['statements'] = ["bn_func(a, n, AXIS)", - "sl_func(a, n, AXIS)"] + run['statements'] = ["bn_func(a, n, axis)", + "sl_func(a, n, axis)"] setup = """ from bottleneck import %s as bn_func from bottleneck.slow import %s as sl_func - if AXIS is None: n = a.size - else: n = a.shape[AXIS] - 1 + if axis is None: n = a.size + else: n = a.shape[axis] - 1 n = max(n / 2, 0) """ % (func, func) - run['setups'] = getsetups(setup, shapes, nans, order) + run['setups'] = getsetups(setup, shapes, nans, axes, dtype, order) suite.append(run) # replace, push @@ -160,8 +165,8 @@ run['statements'] = ["bn_func(a, nan, 0)", "slow_func(a, nan, 0)"] elif func == 'push': - run['statements'] = ["bn_func(a, 5, AXIS)", - "slow_func(a, 5, AXIS)"] + run['statements'] = ["bn_func(a, 5, axis)", + "slow_func(a, 5, axis)"] else: raise ValueError('Unknow function name') setup = """ @@ -169,7 +174,7 @@ from bottleneck import %s as bn_func from bottleneck.slow import %s as slow_func """ % (func, func) - run['setups'] = getsetups(setup, shapes, nans, order) + run['setups'] = getsetups(setup, shapes, nans, axes, dtype, order) suite.append(run) # moving window functions @@ -179,38 +184,14 @@ continue run = {} run['name'] = func - run['statements'] = ["bn_func(a, w, 1, AXIS)", - "sw_func(a, w, 1, AXIS)"] + run['statements'] = ["bn_func(a, w, 1, axis)", + "sw_func(a, w, 1, axis)"] setup = """ from bottleneck.slow.move import %s as sw_func from bottleneck import %s as bn_func - w = a.shape[AXIS] // 5 + w = a.shape[axis] // 5 """ % (func, func) - run['setups'] = getsetups(setup, shapes, nans, order) - if axis != 'None': - suite.append(run) - - # Strip leading spaces from setup code - for i, run in enumerate(suite): - for j in range(len(run['setups'])): - t = run['setups'][j] - t = '\n'.join([z.strip() for z in t.split('\n')]) - suite[i]['setups'][j] = t - - # Set dtype and axis in setups - for i, run in enumerate(suite): - for j in range(len(run['setups'])): - t = run['setups'][j] - t = t.replace('DTYPE', dtype) - t = t.replace('AXIS', axis) - suite[i]['setups'][j] = t - - # Set dtype and axis in statements - for i, run in enumerate(suite): - for j in range(2): - t = run['statements'][j] - t = t.replace('DTYPE', dtype) - t = t.replace('AXIS', axis) - suite[i]['statements'][j] = t + run['setups'] = getsetups(setup, shapes, nans, axes, dtype, order) + suite.append(run) return suite diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/src/bottleneck.h new/Bottleneck-1.2.1/bottleneck/src/bottleneck.h --- old/Bottleneck-1.2.0/bottleneck/src/bottleneck.h 2016-10-13 18:52:06.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/src/bottleneck.h 2017-05-05 23:24:40.000000000 +0200 @@ -31,7 +31,6 @@ #if PY_MAJOR_VERSION >= 3 #define PyString_FromString PyBytes_FromString - #define PyInt_FromLong PyLong_FromLong #define PyInt_AsLong PyLong_AsLong #define PyString_InternFromString PyUnicode_InternFromString #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/src/iterators.h new/Bottleneck-1.2.1/bottleneck/src/iterators.h --- old/Bottleneck-1.2.0/bottleneck/src/iterators.h 2016-10-14 23:16:01.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/src/iterators.h 2017-05-05 23:24:40.000000000 +0200 @@ -21,6 +21,7 @@ npy_intp astrides[NPY_MAXDIMS]; /* a.strides, a.strides[axis] removed */ npy_intp shape[NPY_MAXDIMS]; /* a.shape, a.shape[axis] removed */ char *pa; /* pointer to data corresponding to indices */ + PyArrayObject *a_ravel; /* NULL or pointer to ravelled input array */ }; typedef struct _iter iter; @@ -59,6 +60,11 @@ } } +/* + * If both ravel != 0 and it.a_ravel != NULL then you are responsible for + * calling Py_DECREF(it.a_ravel) after you are done with the iterator. + * See nanargmin for an example. + */ static BN_INLINE void init_iter_all(iter *it, PyArrayObject *a, int ravel, int anyorder) { @@ -70,6 +76,7 @@ it->axis = 0; it->its = 0; it->nits = 1; + it->a_ravel = NULL; if (ndim == 1) { it->ndim_m2 = -1; @@ -81,13 +88,15 @@ it->length = 1; it->astride = 0; } - else if (C_CONTIGUOUS(a)) { + /* The &&! in the next two else ifs is to deal with relaxed + * stride checking introduced in numpy 1.12.0; see gh #161 */ + else if (C_CONTIGUOUS(a) && !F_CONTIGUOUS(a)) { it->ndim_m2 = -1; it->axis = ndim - 1; it->length = PyArray_SIZE(a); it->astride = strides[ndim - 1]; } - else if (F_CONTIGUOUS(a)) { + else if (F_CONTIGUOUS(a) && !C_CONTIGUOUS(a)) { if (anyorder || !ravel) { it->ndim_m2 = -1; it->length = PyArray_SIZE(a); @@ -99,7 +108,7 @@ } else { a = (PyArrayObject *)PyArray_Ravel(a, NPY_CORDER); } - Py_DECREF(a); + it->a_ravel = a; it->length = PyArray_DIM(a, 0); it->astride = PyArray_STRIDE(a, 0); } @@ -111,7 +120,7 @@ } else { a = (PyArrayObject *)PyArray_Ravel(a, NPY_CORDER); } - Py_DECREF(a); + it->a_ravel = a; it->length = PyArray_DIM(a, 0); it->astride = PyArray_STRIDE(a, 0); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/src/move_median/move_median.c new/Bottleneck-1.2.1/bottleneck/src/move_median/move_median.c --- old/Bottleneck-1.2.0/bottleneck/src/move_median/move_median.c 2016-10-13 18:52:06.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/src/move_median/move_median.c 2017-05-05 23:24:40.000000000 +0200 @@ -26,24 +26,26 @@ */ /* helper functions */ -static inline ai_t mm_get_median(mm_handle *mm); -static inline void heapify_small_node(mm_handle *mm, idx_t idx); -static inline void heapify_large_node(mm_handle *mm, idx_t idx); -static inline idx_t mm_get_smallest_child(mm_node **heap, idx_t window, - idx_t idx, mm_node **child); -static inline idx_t mm_get_largest_child(mm_node **heap, idx_t window, - idx_t idx, mm_node **child); -static inline void mm_move_up_small(mm_node **heap, idx_t idx, mm_node *node, - idx_t p_idx, mm_node *parent); -static inline void mm_move_down_small(mm_node **heap, idx_t window, idx_t idx, - mm_node *node); -static inline void mm_move_down_large(mm_node **heap, idx_t idx, mm_node *node, - idx_t p_idx, mm_node *parent); -static inline void mm_move_up_large(mm_node **heap, idx_t window, idx_t idx, - mm_node *node); -static inline void mm_swap_heap_heads(mm_node **s_heap, idx_t n_s, - mm_node **l_heap, idx_t n_l, - mm_node *s_node, mm_node *l_node); +static MM_INLINE ai_t mm_get_median(mm_handle *mm); +static MM_INLINE void heapify_small_node(mm_handle *mm, idx_t idx); +static MM_INLINE void heapify_large_node(mm_handle *mm, idx_t idx); +static MM_INLINE idx_t mm_get_smallest_child(mm_node **heap, idx_t window, + idx_t idx, mm_node **child); +static MM_INLINE idx_t mm_get_largest_child(mm_node **heap, idx_t window, + idx_t idx, mm_node **child); +static MM_INLINE void mm_move_up_small(mm_node **heap, idx_t idx, + mm_node *node, idx_t p_idx, + mm_node *parent); +static MM_INLINE void mm_move_down_small(mm_node **heap, idx_t window, + idx_t idx, mm_node *node); +static MM_INLINE void mm_move_down_large(mm_node **heap, idx_t idx, + mm_node *node, idx_t p_idx, + mm_node *parent); +static MM_INLINE void mm_move_up_large(mm_node **heap, idx_t window, idx_t idx, + mm_node *node); +static MM_INLINE void mm_swap_heap_heads(mm_node **s_heap, idx_t n_s, + mm_node **l_heap, idx_t n_l, + mm_node *s_node, mm_node *l_node); /* @@ -461,7 +463,7 @@ mm->s_first_leaf = FIRST_LEAF(mm->n_s); heapify_small_node(mm, n_s); - } + } /* plug nan array hole */ if (idx != n_n - 1) { @@ -514,19 +516,19 @@ */ /* Return the current median */ -static inline ai_t +static MM_INLINE ai_t mm_get_median(mm_handle *mm) { idx_t n_total = mm->n_l + mm->n_s; if (n_total < mm->min_count) - return NAN; + return MM_NAN(); if (min(mm->window, n_total) % 2 == 1) return mm->s_heap[0]->ai; return (mm->s_heap[0]->ai + mm->l_heap[0]->ai) / 2.0; } -static inline void +static MM_INLINE void heapify_small_node(mm_handle *mm, idx_t idx) { idx_t idx2; @@ -578,7 +580,7 @@ } -static inline void +static MM_INLINE void heapify_large_node(mm_handle *mm, idx_t idx) { idx_t idx2; @@ -633,7 +635,7 @@ /* Return the index of the smallest child of the node. The pointer * child will also be set. */ -static inline idx_t +static MM_INLINE idx_t mm_get_smallest_child(mm_node **heap, idx_t window, idx_t idx, mm_node **child) { idx_t i0 = FC_IDX(idx); @@ -658,7 +660,7 @@ /* Return the index of the largest child of the node. The pointer * child will also be set. */ -static inline idx_t +static MM_INLINE idx_t mm_get_largest_child(mm_node **heap, idx_t window, idx_t idx, mm_node **child) { idx_t i0 = FC_IDX(idx); @@ -682,7 +684,7 @@ /* Move the given node up through the heap to the appropriate position. */ -static inline void +static MM_INLINE void mm_move_up_small(mm_node **heap, idx_t idx, mm_node *node, idx_t p_idx, mm_node *parent) { @@ -698,7 +700,7 @@ /* Move the given node down through the heap to the appropriate position. */ -static inline void +static MM_INLINE void mm_move_down_small(mm_node **heap, idx_t window, idx_t idx, mm_node *node) { mm_node *child; @@ -713,7 +715,7 @@ /* Move the given node down through the heap to the appropriate position. */ -static inline void +static MM_INLINE void mm_move_down_large(mm_node **heap, idx_t idx, mm_node *node, idx_t p_idx, mm_node *parent) { @@ -729,7 +731,7 @@ /* Move the given node up through the heap to the appropriate position. */ -static inline void +static MM_INLINE void mm_move_up_large(mm_node **heap, idx_t window, idx_t idx, mm_node *node) { mm_node *child; @@ -744,7 +746,7 @@ /* Swap the heap heads. */ -static inline void +static MM_INLINE void mm_swap_heap_heads(mm_node **s_heap, idx_t n_s, mm_node **l_heap, idx_t n_l, mm_node *s_node, mm_node *l_node) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/src/move_median/move_median.h new/Bottleneck-1.2.1/bottleneck/src/move_median/move_median.h --- old/Bottleneck-1.2.0/bottleneck/src/move_median/move_median.h 2016-10-13 18:52:06.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/src/move_median/move_median.h 2017-05-05 23:24:40.000000000 +0200 @@ -1,3 +1,4 @@ +#include <string.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> @@ -14,16 +15,6 @@ #define NUM_CHILDREN 8 #endif -#if defined(_MSC_VER) && (_MSC_VER < 1900) - #define inline __inline - static __inline ai_t __NAN() { - ai_t value; - memset(&value, 0xFF, sizeof(value)); - return value; - } - #define NAN __NAN() -#endif - /* Find indices of parent and first child */ #define P_IDX(i) ((i) - 1) / NUM_CHILDREN #define FC_IDX(i) NUM_CHILDREN * (i) + 1 @@ -75,3 +66,29 @@ /* functions common to non-nan and nan cases */ void mm_reset(mm_handle *mm); void mm_free(mm_handle *mm); + +/* Copied from Cython ---------------------------------------------------- */ + +/* inline attribute */ +#ifndef MM_INLINE + #if defined(__GNUC__) + #define MM_INLINE __inline__ + #elif defined(_MSC_VER) + #define MM_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define MM_INLINE inline + #else + #define MM_INLINE + #endif +#endif + +/* NaN */ +#ifdef NAN + #define MM_NAN() ((float) NAN) +#else + static MM_INLINE float MM_NAN(void) { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; + } +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/src/nonreduce_axis_template.c new/Bottleneck-1.2.1/bottleneck/src/nonreduce_axis_template.c --- old/Bottleneck-1.2.0/bottleneck/src/nonreduce_axis_template.c 2016-10-17 18:26:25.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/src/nonreduce_axis_template.c 2017-05-05 23:24:40.000000000 +0200 @@ -780,7 +780,7 @@ Input array. If `a` is not an array, a conversion is attempted. kth : int The value of the element at index `kth` will be in its sorted - postion. Smaller (larger) or equal values will be to the left + position. Smaller (larger) or equal values will be to the left (right) of index `kth`. axis : {int, None}, optional Axis along which the partition is performed. The default @@ -845,7 +845,7 @@ Input array. If `a` is not an array, a conversion is attempted. kth : int The value of the element at index `kth` will be in its sorted - postion. Smaller (larger) or equal values will be to the left + position. Smaller (larger) or equal values will be to the left (right) of index `kth`. axis : {int, None}, optional Axis along which the partition is performed. The default (axis=-1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/src/reduce_template.c new/Bottleneck-1.2.1/bottleneck/src/reduce_template.c --- old/Bottleneck-1.2.0/bottleneck/src/reduce_template.c 2016-10-17 18:27:38.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/src/reduce_template.c 2017-05-05 23:24:40.000000000 +0200 @@ -11,6 +11,12 @@ iter it; \ init_iter_all(&it, a, 1, 0); +/* used with INIT_ALL_RAVEL */ +#define DECREF_INIT_ALL_RAVEL \ + if (it.a_ravel != NULL) { \ + Py_DECREF(it.a_ravel); \ + } + #define INIT_ONE(dtype0, dtype1) \ iter it; \ PyObject *y; \ @@ -123,7 +129,7 @@ NEXT } BN_END_ALLOW_THREADS - return PyInt_FromLong(asum); + return PyLong_FromLongLong(asum); } REDUCE_ONE(nansum, DTYPE0) @@ -500,7 +506,7 @@ NEXT } BN_END_ALLOW_THREADS - return PyInt_FromLong(extreme); + return PyLong_FromLongLong(extreme); } REDUCE_ONE(NAME, DTYPE0) @@ -545,6 +551,7 @@ Py_ssize_t idx = 0; INIT_ALL_RAVEL if (SIZE == 0) { + DECREF_INIT_ALL_RAVEL VALUE_ERR("numpy.NAME raises on a.size==0 and axis=None; " "So Bottleneck too."); return NULL; @@ -559,11 +566,12 @@ } } BN_END_ALLOW_THREADS + DECREF_INIT_ALL_RAVEL if (allnan) { VALUE_ERR("All-NaN slice encountered"); return NULL; } else { - return PyInt_FromLong(idx); + return PyLong_FromLongLong(idx); } } @@ -613,6 +621,7 @@ npy_DTYPE0 ai, extreme = BIG_INT; INIT_ALL_RAVEL if (SIZE == 0) { + DECREF_INIT_ALL_RAVEL VALUE_ERR("numpy.NAME raises on a.size==0 and axis=None; " "So Bottleneck too."); return NULL; @@ -626,7 +635,8 @@ } } BN_END_ALLOW_THREADS - return PyInt_FromLong(idx); + DECREF_INIT_ALL_RAVEL + return PyLong_FromLongLong(idx); } REDUCE_ONE(NAME, DTYPE0) @@ -718,7 +728,7 @@ NEXT } BN_END_ALLOW_THREADS - return PyInt_FromLong(asum); + return PyLong_FromLongLong(asum); } REDUCE_ONE(ss, DTYPE0) @@ -844,6 +854,7 @@ done: BUFFER_DELETE BN_END_ALLOW_THREADS + DECREF_INIT_ALL_RAVEL return PyFloat_FromDouble(med); } @@ -888,6 +899,7 @@ BUFFER_DELETE } BN_END_ALLOW_THREADS + DECREF_INIT_ALL_RAVEL return PyFloat_FromDouble(med); } @@ -1203,7 +1215,7 @@ { int ndim; - int axis; + int axis = 0; /* initialize to avoid compiler error */ int dtype; int ddof; int reduce_all = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/tests/util.py new/Bottleneck-1.2.1/bottleneck/tests/util.py --- old/Bottleneck-1.2.0/bottleneck/tests/util.py 2016-10-18 20:28:39.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/tests/util.py 2017-05-15 18:14:03.000000000 +0200 @@ -109,6 +109,7 @@ yield np.array([1, 2, 3]) + 1e9 # check that move_std is robust yield np.array([0, 0, 0]) # nanargmax/nanargmin yield np.array([1, nan, nan, 2]) # nanmedian + yield np.array([2**31], dtype=np.int64) # overflows on windows # ties yield np.array([0, 0, 0]) @@ -155,6 +156,7 @@ yield a.reshape(shape) # non-contiguous arrays + yield np.array([[1, 2], [3, 4]])[:, [1]] # gh 161 for dtype in dtypes: # 1d a = np.arange(12).astype(dtype) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/bottleneck/version.py new/Bottleneck-1.2.1/bottleneck/version.py --- old/Bottleneck-1.2.0/bottleneck/version.py 2016-10-20 18:10:09.000000000 +0200 +++ new/Bottleneck-1.2.1/bottleneck/version.py 2017-05-15 18:28:36.000000000 +0200 @@ -1,4 +1,3 @@ "Bottleneck version" -# Format expected by setup.py and doc/source/conf.py: string of form "X.Y.Z" -__version__ = "1.2.0" +__version__ = "1.2.1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/doc/source/conf.py new/Bottleneck-1.2.1/doc/source/conf.py --- old/Bottleneck-1.2.0/doc/source/conf.py 2015-03-24 16:52:45.000000000 +0100 +++ new/Bottleneck-1.2.1/doc/source/conf.py 2017-05-05 23:24:40.000000000 +0200 @@ -39,7 +39,7 @@ # General information about the project. project = u'Bottleneck' -copyright = u'2010-2015 Keith Goodman' +copyright = u'2010-2017 Keith Goodman' # Grab version from bottleneck/version.py ver_file = os.path.join('..', '..', 'bottleneck', 'version.py') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/doc/source/intro.rst new/Bottleneck-1.2.1/doc/source/intro.rst --- old/Bottleneck-1.2.0/doc/source/intro.rst 2016-10-20 20:44:46.000000000 +0200 +++ new/Bottleneck-1.2.1/doc/source/intro.rst 2017-05-15 18:31:47.000000000 +0200 @@ -27,41 +27,42 @@ >>> bn.bench() Bottleneck performance benchmark - Bottleneck 1.2.0; Numpy 1.11.2 + Bottleneck 1.3.0.dev0; Numpy 1.12.1 Speed is NumPy time divided by Bottleneck time - NaN means approx one-fifth NaNs; float64 and axis=-1 are used + NaN means approx one-fifth NaNs; float64 used - no NaN NaN no NaN NaN - (100,) (1000,) (1000,1000)(1000,1000) - nansum 58.3 16.6 2.3 5.1 - nanmean 258.7 46.1 3.5 5.1 - nanstd 238.4 42.9 2.8 5.0 - nanvar 229.9 41.4 2.7 5.0 - nanmin 44.6 12.9 0.8 0.9 - nanmax 41.8 12.9 0.8 1.8 - median 99.6 51.4 1.1 5.7 - nanmedian 102.1 26.5 5.0 31.2 - ss 27.4 6.4 1.6 1.6 - nanargmin 72.6 24.6 2.3 3.4 - nanargmax 70.1 29.2 2.4 4.6 - anynan 22.1 49.9 0.5 114.6 - allnan 43.3 48.4 115.8 66.7 - rankdata 50.3 8.0 2.6 6.5 - nanrankdata 52.5 8.1 2.9 6.8 - partition 4.1 3.6 1.0 2.0 - argpartition 2.7 2.2 1.1 1.5 - replace 13.7 4.9 1.5 1.5 - push 3231.6 7437.4 20.1 19.6 - move_sum 4173.5 8955.4 194.7 374.8 - move_mean 10265.5 18540.0 222.8 372.2 - move_std 8910.9 12158.5 128.7 234.5 - move_var 11969.4 18323.8 202.7 378.7 - move_min 2164.6 3676.3 23.9 57.2 - move_max 1995.0 4206.0 23.8 108.8 - move_argmin 3380.5 5559.1 40.5 180.5 - move_argmax 3386.5 7278.1 43.0 227.2 - move_median 1762.3 1134.9 157.9 118.5 - move_rank 1203.6 223.2 2.7 7.8 + no NaN no NaN NaN no NaN NaN + (100,) (1000,1000)(1000,1000)(1000,1000)(1000,1000) + axis=0 axis=0 axis=0 axis=1 axis=1 + nansum 67.3 0.3 0.7 2.5 2.4 + nanmean 194.8 1.9 2.1 3.4 3.1 + nanstd 241.5 1.6 2.1 2.7 2.6 + nanvar 229.7 1.7 2.1 2.7 2.5 + nanmin 34.1 0.7 1.1 0.8 2.6 + nanmax 45.6 0.7 2.7 1.0 3.7 + median 111.0 1.3 5.6 1.0 4.8 + nanmedian 108.8 5.9 6.7 5.6 6.7 + ss 16.3 1.1 1.2 1.6 1.6 + nanargmin 89.2 2.9 5.1 2.2 5.6 + nanargmax 107.4 3.0 5.4 2.2 5.8 + anynan 19.4 0.3 35.0 0.5 29.9 + allnan 39.9 146.6 128.3 115.8 75.6 + rankdata 55.0 2.6 2.3 2.9 2.8 + nanrankdata 59.8 2.8 2.2 3.2 2.5 + partition 4.4 1.2 1.6 1.0 1.4 + argpartition 3.5 1.1 1.4 1.1 1.6 + replace 17.7 1.4 1.4 1.3 1.4 + push 3440.0 7.8 9.5 20.0 15.5 + move_sum 4743.0 75.7 156.1 195.4 211.1 + move_mean 8760.9 116.2 167.4 252.1 258.8 + move_std 8979.9 96.1 196.3 144.0 256.3 + move_var 11216.8 127.3 243.9 225.9 321.4 + move_min 2245.3 20.6 36.7 23.2 42.1 + move_max 2223.7 20.5 37.2 24.1 42.4 + move_argmin 3664.0 48.2 73.3 40.2 83.9 + move_argmax 3916.9 42.0 75.4 41.5 81.2 + move_median 2023.3 166.8 173.7 153.8 154.3 + move_rank 1208.5 1.9 1.9 2.5 2.8 You can also run a detailed benchmark for a single function using, for example, the command:: @@ -96,7 +97,7 @@ Requirements: ======================== ==================================================== -Bottleneck Python 2.7, 3.4, 3.5; NumPy 1.11.2 +Bottleneck Python 2.7, 3.5, 3.6; NumPy 1.12.1 Compile gcc, clang, MinGW or MSVC Unit tests nose ======================== ==================================================== Binary files old/Bottleneck-1.2.0/doc/sphinxext/docscrape.pyc and new/Bottleneck-1.2.1/doc/sphinxext/docscrape.pyc differ Binary files old/Bottleneck-1.2.0/doc/sphinxext/docscrape_sphinx.pyc and new/Bottleneck-1.2.1/doc/sphinxext/docscrape_sphinx.pyc differ Binary files old/Bottleneck-1.2.0/doc/sphinxext/numpydoc.pyc and new/Bottleneck-1.2.1/doc/sphinxext/numpydoc.pyc differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/setup.cfg new/Bottleneck-1.2.1/setup.cfg --- old/Bottleneck-1.2.0/setup.cfg 2016-10-20 20:48:43.000000000 +0200 +++ new/Bottleneck-1.2.1/setup.cfg 2017-05-15 18:49:14.000000000 +0200 @@ -1,5 +1,4 @@ [egg_info] tag_build = tag_date = 0 -tag_svn_revision = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/setup.py new/Bottleneck-1.2.1/setup.py --- old/Bottleneck-1.2.0/setup.py 2016-10-15 21:56:07.000000000 +0200 +++ new/Bottleneck-1.2.1/setup.py 2017-05-05 23:24:40.000000000 +0200 @@ -23,7 +23,8 @@ # prevent numpy from thinking it is still in its setup process __builtins__.__NUMPY_SETUP__ = False import numpy - self.include_dirs.append(numpy.get_include()) + # place numpy includes first, see gh #156 + self.include_dirs.insert(0, numpy.get_include()) def prepare_modules(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Bottleneck-1.2.0/tox.ini new/Bottleneck-1.2.1/tox.ini --- old/Bottleneck-1.2.0/tox.ini 2016-10-15 18:18:14.000000000 +0200 +++ new/Bottleneck-1.2.1/tox.ini 2017-05-05 23:24:40.000000000 +0200 @@ -1,23 +1,23 @@ # Tox (http://tox.testrun.org/) configuration [tox] -envlist = py27_np1112, py34_np1112 +envlist = py27_np1121, py35_np1121 [testenv] changedir={envdir} commands={envpython} {toxinidir}/tools/test-installed-bottleneck.py {posargs:} -[testenv:py27_np1112] +[testenv:py27_np1121] basepython = python2.7 deps = nose - numpy==1.11.2 + numpy==1.12.1 -[testenv:py34_np1112] -basepython = python3.4 +[testenv:py35_np1121] +basepython = python3.5 deps = nose - numpy==1.11.2 + numpy==1.12.1 # Not run by default. Use 'tox -e py27_npmaster' to call it [testenv:py27_npmaster]
