Re: dict comprehension

Discussion in 'Python' started by Terry Reedy, Feb 1, 2008.

  1. Terry Reedy

    Terry Reedy Guest

    "Daniel Fetchinson" <> wrote in message
    news:...
    | Hi folks,
    |
    | There is a withdrawn PEP about a new syntax for dict comprehension:
    | http://www.python.org/dev/peps/pep-0274/ which says:

    I believe both set and dict comprehensions will be in 3.0.
     
    Terry Reedy, Feb 1, 2008
    #1
    1. Advertising

  2. On Feb 1, 6:21 am, "Terry Reedy" <> wrote:
    > "Daniel Fetchinson" <> wrote in message
    >
    > news:...
    > | Hi folks,
    > |
    > | There is a withdrawn PEP about a new syntax for dict comprehension:
    > |http://www.python.org/dev/peps/pep-0274/which says:
    >
    > I believe both set and dict comprehensions will be in 3.0.


    Python 3.0a1+ (py3k:59330, Dec 4 2007, 18:44:39)
    [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> {x*x for x in range(10)}

    {0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
    >>> {x:x*x for x in range(10)}

    {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
    >>>


    That's nice.

    --
    Arnaud
     
    Arnaud Delobelle, Feb 1, 2008
    #2
    1. Advertising

  3. Arnaud Delobelle wrote:
    >> I believe both set and dict comprehensions will be in 3.0.

    >
    > Python 3.0a1+ (py3k:59330, Dec 4 2007, 18:44:39)
    > [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    > Type "help", "copyright", "credits" or "license" for more information.
    >>>> {x*x for x in range(10)}

    > {0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
    >>>> {x:x*x for x in range(10)}

    > {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
    >

    OK, not bad. But I don't really see how this is better than the
    generator approach.

    Also, what is that first thing? A valueless dict (and thus a set)?

    /W
     
    Wildemar Wildenburger, Feb 1, 2008
    #3
  4. Wildemar Wildenburger wrote:
    > Arnaud Delobelle wrote:
    >>> I believe both set and dict comprehensions will be in 3.0.

    >>
    >> Python 3.0a1+ (py3k:59330, Dec 4 2007, 18:44:39)
    >> [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    >> Type "help", "copyright", "credits" or "license" for more information.
    >>>>> {x*x for x in range(10)}

    >> {0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
    >>>>> {x:x*x for x in range(10)}

    >> {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
    >>

    > OK, not bad. But I don't really see how this is better than the
    > generator approach.


    It's a literal syntax, just like you would do with a list, i.e. a list
    comprehension. Why should you have list comps and no dict comps?


    > Also, what is that first thing? A valueless dict (and thus a set)?


    It's the literal set syntax added in 3.0. You can write

    {1,2,3}

    to get a set() or

    {1:1,2:2}

    to get a dict().

    Stefan
     
    Stefan Behnel, Feb 1, 2008
    #4
  5. Wildemar Wildenburger wrote:
    > Arnaud Delobelle wrote:
    >>> I believe both set and dict comprehensions will be in 3.0.

    >>
    >> Python 3.0a1+ (py3k:59330, Dec 4 2007, 18:44:39)
    >> [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    >> Type "help", "copyright", "credits" or "license" for more information.
    >>>>> {x*x for x in range(10)}

    >> {0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
    >>>>> {x:x*x for x in range(10)}

    >> {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
    >>

    > OK, not bad. But I don't really see how this is better than the
    > generator approach.


    It's more than twice as fast:

    >>> setup = "items = range(10)"
    >>> timeit.Timer("dict((x, x * x) for x in items)", setup).timeit()

    6.0559464959932114
    >>> timeit.Timer("{x:x * x for x in items}", setup).timeit()

    2.8347301821879682

    It also doesn't build the unnecessary intermediate tuples:

    >>> def dict_genexp(items):

    .... return dict((x, x * x) for x in items)
    ....
    >>> def dict_comp(items):

    .... return {x:x * x for x in items}
    ....
    >>> dis.dis(dict_genexp.__code__.co_consts[1])

    2 0 LOAD_FAST 0 (.0)
    >> 3 FOR_ITER 21 (to 27)

    6 STORE_FAST 1 (x)
    9 LOAD_FAST 1 (x)
    12 LOAD_FAST 1 (x)
    15 LOAD_FAST 1 (x)
    18 BINARY_MULTIPLY
    19 BUILD_TUPLE 2
    22 YIELD_VALUE
    23 POP_TOP
    24 JUMP_ABSOLUTE 3
    >> 27 LOAD_CONST 0 (None)

    30 RETURN_VALUE
    >>> dis.dis(dict_comp.__code__.co_consts[1])

    2 0 BUILD_MAP 0
    3 DUP_TOP
    4 STORE_FAST 1 (_[1])
    7 LOAD_FAST 0 (.0)
    >> 10 FOR_ITER 21 (to 34)

    13 STORE_FAST 2 (x)
    16 LOAD_FAST 1 (_[1])
    19 LOAD_FAST 2 (x)
    22 LOAD_FAST 2 (x)
    25 BINARY_MULTIPLY
    26 ROT_TWO
    27 LOAD_FAST 2 (x)
    30 STORE_SUBSCR
    31 JUMP_ABSOLUTE 10
    >> 34 RETURN_VALUE


    STeVe
     
    Steven Bethard, Feb 2, 2008
    #5
  6. Terry Reedy

    Guest

    Steven Bethard:
    > It also doesn't build the unnecessary intermediate tuples:


    I see, but can't the interpreter improved to remove similar
    intermediate tuples anyway? Is this a difficult thing to do?

    Bye,
    bearophile
     
    , Feb 2, 2008
    #6
  7. On Feb 2, 9:10 pm, wrote:
    > Steven Bethard:
    >
    > > It also doesn't build the unnecessary intermediate tuples:

    >
    > I see, but can't the interpreter improved to remove similar
    > intermediate tuples anyway?


    Do you mean the compiler?

    > Is this a difficult thing to do?


    Yes, due to the HDNP (Highly Dynamic Nature of Python).

    --
    Arnaud
     
    Arnaud Delobelle, Feb 3, 2008
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Daniel Fetchinson

    dict comprehension

    Daniel Fetchinson, Feb 1, 2008, in forum: Python
    Replies:
    1
    Views:
    292
    Paul Rubin
    Feb 1, 2008
  2. Ryan Ginstrom

    RE: dict comprehension

    Ryan Ginstrom, Feb 1, 2008, in forum: Python
    Replies:
    3
    Views:
    313
  3. Ernst-Ludwig Brust

    Dict Comprehension ?

    Ernst-Ludwig Brust, Oct 6, 2008, in forum: Python
    Replies:
    5
    Views:
    377
    Ernst-Ludwig Brust
    Oct 7, 2008
  4. Vedran Furac(
    Replies:
    4
    Views:
    356
    Marc 'BlackJack' Rintsch
    Dec 19, 2008
  5. Peng Yu
    Replies:
    8
    Views:
    387
    Steven D'Aprano
    Nov 20, 2009
Loading...

Share This Page