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/pull/3054#issuecomment-520048334,https://api.github.com/repos/pydata/xarray/issues/3054,520048334,MDEyOklzc3VlQ29tbWVudDUyMDA0ODMzNA==,6213168,2019-08-09T20:10:29Z,2019-08-09T20:29:23Z,MEMBER,"Mh. Actually it looks like ``ndarray.flat`` is the fastest way to iterate over numpy. Still considerably slower than a CPython iterator though ```python import numpy N = 1000000 a = numpy.arange(N) def exhaust(it): for _ in it: pass %timeit exhaust(a) 24.8 ms ± 723 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit exhaust(a.flat) 20.4 ms ± 701 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit exhaust(a.tolist()) 27.2 ms ± 1.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit exhaust(range(N)) 10.5 ms ± 234 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) ``` ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,462049420 https://github.com/pydata/xarray/pull/3054#issuecomment-520016328,https://api.github.com/repos/pydata/xarray/issues/3054,520016328,MDEyOklzc3VlQ29tbWVudDUyMDAxNjMyOA==,6213168,2019-08-09T18:19:05Z,2019-08-09T18:19:05Z,MEMBER,"@yohai Iterating point by point in pure python over numpy data is horribly slow. ``numpy.ndarray.flat`` is there mostly to be used within cython/numba code. In a DataArray it's much worse than in a plain ndarray, because every time you invoke the slice operator to fetch a single element it's being applied to all coordinates too. If you just need to iterate over the values of a DataArray, then ``DataArray.values.ravel().tolist()`` is the fastest option that I know of (``ndarray.tolist()`` is much faster than ``list(ndarray)``!). If you need the coords as well, then I suspect you may be doing it wrong - could you show a simple example of your use case? ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,462049420 https://github.com/pydata/xarray/pull/3054#issuecomment-519875542,https://api.github.com/repos/pydata/xarray/issues/3054,519875542,MDEyOklzc3VlQ29tbWVudDUxOTg3NTU0Mg==,6213168,2019-08-09T10:53:59Z,2019-08-09T10:58:00Z,MEMBER,"Indeed this is extremely inefficient. I'm afraid it's a -1 from me. You can get the same with a much faster one-liner: ``a.stack(__flat=a.dims).reset_index('__flat')`` (although admittedly it's more RAM-intensive). On related notes, - stack() could use a set_index=True optional parameter that avoids you from going through a MultiIndex if you don't need one - stack() should accept non-string hashables; this would allow avoiding potential collisions (e.g. ``flat = object()``) - there is an issue with the stack -> reset_index round-trip where it converts unicode variables to object #907 ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,462049420