yield from () Was: Re: weirdness with list()

Serhiy Storchaka storchaka at gmail.com
Thu Mar 11 16:01:35 EST 2021


01.03.21 23:59, Cameron Simpson пише:
> On 28Feb2021 23:47, Alan Gauld <alan.gauld at yahoo.co.uk> wrote:
>> On 28/02/2021 00:17, Cameron Simpson wrote:
>>> BUT... It also has a __iter__ value, which like any Box iterates over
>>> the subboxes. For MDAT that is implemented like this:
>>>
>>>     def __iter__(self):
>>>         yield from ()
>>
>> Sorry, a bit OT but I'm curious. I haven't seen
>> this before:
>>
>> yield from ()
>>
>> What is it doing?
>> What do the () represent in this context?
> 
> It's an empty tuple. The yield from iterates over the tuple, yielding 
> zero times. There are shorter ways to write that (eg outright omitting 
> the yield), except when you're writing a generator function with only a 
> single yield statement - then you need something like that to make it a 
> generator.

I was wondering what from following variants is more efficient:

    def gen1():
        yield from ()

    def gen2():
        return
        yield

    def gen3():
        return iter(())


$ python3.9 -m timeit -s 'def g(): yield from ()' 'list(g())'
1000000 loops, best of 5: 266 nsec per loop
$ python3.9 -m timeit -s 'def g():' -s ' return' -s ' yield' 'list(g())'
1000000 loops, best of 5: 219 nsec per loop
$ python3.9 -m timeit -s 'def g(): return iter(())' 'list(g())'
2000000 loops, best of 5: 192 nsec per loop



More information about the Python-list mailing list