In a sense this discussion is really about making np.array(iterable) more efficient, so I restarted the discussion at https://mail.scipy.org/pipermail/numpy-discussion/2016-February/075059.html
Antony 2016-02-18 14:21 GMT-08:00 Chris Barker <chris.bar...@noaa.gov>: > On Thu, Feb 18, 2016 at 10:15 AM, Antony Lee <antony....@berkeley.edu> > wrote: > >> Mostly so that there is no performance lost when someone passes >> range(...) instead of np.arange(...). At least I had never realized that >> one is much faster than the other and always just passed range() as a >> convenience. >> > > Well, pretty much everything in numpy is faster if you use the numpy > array version rather than plain python -- this hardly seems like the extra > code would be worth it. > > numpy's array() constructor can (and should) take an arbitrary iterable. > > It does make some sense that you we might want to special case iterators, > as you don't want to loop through them too many times, which is what > np.fromiter() is for. > > and _maybe_ it would be worth special casing python lists, as you can > access items faster, and they are really, really common (or has this > already been done?), but special casing range() is getting silly. And it > might be hard to do. At the C level I suppose you could actually know what > the parameters and state of the range object are and create an array > directly from that -- but that's what arange is for... > > -CHB > > > >> 2016-02-17 10:50 GMT-08:00 Chris Barker <chris.bar...@noaa.gov>: >> >>> On Sun, Feb 14, 2016 at 11:41 PM, Antony Lee <antony....@berkeley.edu> >>> wrote: >>> >>>> So how can np.array(range(...)) even work? >>>> >>> >>> range() (in py3) is not a generator, nor is is a iterator. it is a >>> range object, which is lazily evaluated, and satisfies both the iterator >>> protocol and the sequence protocol (at least most of it: >>> >>> In [*1*]: r = range(10) >>> >>> >>> In [*2*]: r[3] >>> >>> Out[*2*]: 3 >>> >>> >>> In [*3*]: len(r) >>> >>> Out[*3*]: 10 >>> >>> >>> In [*4*]: type(r) >>> >>> Out[*4*]: range >>> >>> In [*9*]: isinstance(r, collections.abc.Sequence) >>> >>> Out[*9*]: True >>> >>> In [*10*]: l = list() >>> >>> In [*11*]: isinstance(l, collections.abc.Sequence) >>> >>> Out[*11*]: True >>> >>> In [*12*]: isinstance(r, collections.abc.Iterable) >>> >>> Out[*12*]: True >>> I'm still totally confused as to why we'd need to special-case range >>> when we have arange(). >>> >>> -CHB >>> >>> >>> >>> -- >>> >>> Christopher Barker, Ph.D. >>> Oceanographer >>> >>> Emergency Response Division >>> NOAA/NOS/OR&R (206) 526-6959 voice >>> 7600 Sand Point Way NE (206) 526-6329 fax >>> Seattle, WA 98115 (206) 526-6317 main reception >>> >>> chris.bar...@noaa.gov >>> >>> _______________________________________________ >>> NumPy-Discussion mailing list >>> NumPy-Discussion@scipy.org >>> https://mail.scipy.org/mailman/listinfo/numpy-discussion >>> >>> >> >> _______________________________________________ >> NumPy-Discussion mailing list >> NumPy-Discussion@scipy.org >> https://mail.scipy.org/mailman/listinfo/numpy-discussion >> >> > > > -- > > Christopher Barker, Ph.D. > Oceanographer > > Emergency Response Division > NOAA/NOS/OR&R (206) 526-6959 voice > 7600 Sand Point Way NE (206) 526-6329 fax > Seattle, WA 98115 (206) 526-6317 main reception > > chris.bar...@noaa.gov > > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@scipy.org > https://mail.scipy.org/mailman/listinfo/numpy-discussion > >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org https://mail.scipy.org/mailman/listinfo/numpy-discussion