html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue
https://github.com/pydata/xarray/issues/2799#issuecomment-553948714,https://api.github.com/repos/pydata/xarray/issues/2799,553948714,MDEyOklzc3VlQ29tbWVudDU1Mzk0ODcxNA==,6213168,2019-11-14T15:50:35Z,2019-11-14T15:50:35Z,MEMBER,"#3533 closes the gap between DataArray and numpy from 500x slower to ""just"" 100x slower :)","{""total_count"": 2, ""+1"": 2, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,416962458
https://github.com/pydata/xarray/issues/2799#issuecomment-539218376,https://api.github.com/repos/pydata/xarray/issues/2799,539218376,MDEyOklzc3VlQ29tbWVudDUzOTIxODM3Ng==,6213168,2019-10-07T21:46:32Z,2019-10-07T21:53:33Z,MEMBER,"I tried playing around with pypy 3.6.
Big fat disclaimer: I **did not** run any of the xarray unit tests. Expect trouble if you do.
1.
```bash
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
set -o xtrace
tar -xvjf Downloads/pypy3.6-v7.1.1-linux64.tar.bz2
cd pypy3.6-v7.1.1-linux64/bin
./pypy3 -m ensurepip
./pip3.6 install -U pip wheel
./pip list | awk 'NR > 2 {print $1}' | grep -v greenlet | xargs ./pip install -U
# sudo apt-get install libopenblas-dev gfortran
./pip install numpy pandas xarray
```
2. to work around https://bitbucket.org/pypy/pypy/issues/3087/collectionsabc-__init_subclass__-failure, edit ``xarray/core/common.py`` and delete ``AttrAccessMixin.__init_subclass__``
3. timeit is unreliable in pypy. I modified the benchmark as follows:
```python
import time
import numpy as np
import xarray as xr
shape = (10, 10, 10, 10)
index = (0, 0, 0, 0)
np_arr = np.ones(shape)
arr = xr.DataArray(np_arr)
N = 10000
def bench_slice(obj):
for _ in range(4):
t0 = time.time()
for _ in range(N):
obj[index]
t1 = time.time()
t_ns = (t1 - t0) / N * 1e9
print(f""{t_ns:6.0f} ns {obj.__class__.__name__}"")
bench_slice(arr)
bench_slice(np_arr)
```
Benchmark outputs:
CPython 3.7:
```
93496 ns DataArray
92732 ns DataArray
92560 ns DataArray
93427 ns DataArray
119 ns ndarray
121 ns ndarray
122 ns ndarray
119 ns ndarray
```
PyPy 7.1 3.6:
```
113273 ns DataArray
38543 ns DataArray
34797 ns DataArray
39453 ns DataArray
386 ns ndarray
289 ns ndarray
329 ns ndarray
413 ns ndarray
```
Big important reminder: all results are for a very small array. I would expect the gap between CPython and pypy to get narrower in % (both for numpy and xarray) as the array size gets larger and more time is spent in the pure C numpy code.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,416962458
https://github.com/pydata/xarray/issues/2799#issuecomment-538570946,https://api.github.com/repos/pydata/xarray/issues/2799,538570946,MDEyOklzc3VlQ29tbWVudDUzODU3MDk0Ng==,6213168,2019-10-04T21:48:18Z,2019-10-06T21:56:58Z,MEMBER,"I simplified the benchmark:
```python
from itertools import product
import numpy as np
import xarray as xr
shape = (10, 10, 10, 10)
index = (0, 0, 0, 0)
np_arr = np.ones(shape)
arr = xr.DataArray(np_arr)
named_index = dict(zip(arr.dims, index))
print(index)
print(named_index)
%timeit -n 1000 arr[index]
%timeit -n 1000 arr.isel(**named_index)
%timeit -n 1000 np_arr[index]
```
```
(0, 0, 0, 0)
{'dim_0': 0, 'dim_1': 0, 'dim_2': 0, 'dim_3': 0}
90.8 µs ± 5.12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
88.5 µs ± 2.74 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
115 ns ± 6.71 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
```
```python
%%prun -s cumulative
for _ in range(10000):
arr[index]
```
```
5680003 function calls (5630003 primitive calls) in 1.890 seconds
Ordered by: cumulative time
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 1.890 1.890 {built-in method builtins.exec}
1 0.009 0.009 1.890 1.890 :1()
10000 0.011 0.000 1.881 0.000 dataarray.py:629(__getitem__)
10000 0.030 0.000 1.801 0.000 dataarray.py:988(isel)
10000 0.084 0.000 1.567 0.000 dataset.py:1842(isel)
10000 0.094 0.000 0.570 0.000 dataset.py:1746(_validate_indexers)
10000 0.029 0.000 0.375 0.000 variable.py:960(isel)
10000 0.013 0.000 0.319 0.000 variable.py:666(__getitem__)
20000 0.014 0.000 0.251 0.000 dataset.py:918(_replace_with_new_dims)
50000 0.028 0.000 0.245 0.000 variable.py:272(__init__)
10000 0.035 0.000 0.211 0.000 variable.py:487(_broadcast_indexes)
1140000/1100000 0.100 0.000 0.168 0.000 {built-in method builtins.isinstance}
10000 0.050 0.000 0.157 0.000 dataset.py:1802(_get_indexers_coords_and_indexes)
20000 0.025 0.000 0.153 0.000 dataset.py:868(_replace)
50000 0.085 0.000 0.152 0.000 variable.py:154(as_compatible_data)
```
Time breakdown:
Total | 1.881
-- | --
DataArray.\_\_getitem\_\_ | 0.080
DataArray.isel (_to_temp_dataset roundtrip) | 0.234
Dataset.isel | 0.622
Dataset._validate_indexers | 0.570
Variable.isel | 0.056
Variable.\_\_getitem\_\_ | 0.319
I can spot a few low-hanging fruits there:
- huge amount of time spent on _validate_indexers
- Why is ``variable__init__`` being called 5 times?!? I expected 0.
- The bench strongly hints at the fact that we're creating on the fly dummy IndexVariables
- We're casting the DataArray to a Dataset, converting the positional index to a dict, then converting it back to positional for each variable. Maybe it's a good idea to rewrite DataArray.sel/isel so that they don't use _to_temp_dataset?
So in short while I don't think we can feasibly close the order-of-magnitude gap (800x) with numpy, I suspect we could get at least a 5x speedup here.","{""total_count"": 5, ""+1"": 5, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,416962458
https://github.com/pydata/xarray/issues/2799#issuecomment-538791352,https://api.github.com/repos/pydata/xarray/issues/2799,538791352,MDEyOklzc3VlQ29tbWVudDUzODc5MTM1Mg==,6213168,2019-10-06T21:47:20Z,2019-10-06T21:48:48Z,MEMBER,"After #3375:
1.371 | TOTAL
-- | --
0.082 | DataArray.\_\_getitem\_\_
0.217 | DataArray.isel (_to_temp_dataset roundtrip)
0.740 | Dataset.isel
0.056 | Variable.isel
0.276 | Variable.\_\_getitem\_\_
The offending lines in Dataset.isel are these, and I strongly suspect they are improvable:
https://github.com/pydata/xarray/blob/4254b4af33843f711459e5242018cd1d678ad3a0/xarray/core/dataset.py#L1922-L1930","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,416962458
https://github.com/pydata/xarray/issues/2799#issuecomment-538790722,https://api.github.com/repos/pydata/xarray/issues/2799,538790722,MDEyOklzc3VlQ29tbWVudDUzODc5MDcyMg==,6213168,2019-10-06T21:38:44Z,2019-10-06T21:38:44Z,MEMBER,All those integer indexes were cast into Variables. #3375 stops that.,"{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,416962458
https://github.com/pydata/xarray/issues/2799#issuecomment-529578839,https://api.github.com/repos/pydata/xarray/issues/2799,529578839,MDEyOklzc3VlQ29tbWVudDUyOTU3ODgzOQ==,6213168,2019-09-09T17:15:08Z,2019-09-09T17:15:08Z,MEMBER,"> Pythran supports Python 2.7 and also has a decent Python 3 support.
> [...]
> Pythran now supports Python3 and can be installed as a regular Python3 program. Note however that Python3 support is still in early stage and compilation failure may happen. Report them!
This is _not_ a great start :(
It's the first time I hear about Pythran. At first sight it looks somewhat like a hybrid between Cython (for the ahead-of-time transpiling to C++) and numba (for having python-compatible syntax).
That said, I didn't see anything that hints at potential speedups on the python boilerplate code.
I already had experience with compiling pure-python code (tight ``__iter__`` methods) with Cython, and got around 30% performance boost which - while nothing to scoff at - is not life-changing either.
This said, I'd have to spend more time on it to get a more informed opinion.
","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,416962458