[Python-3000] Set literal

Ron Adam rrr at ronadam.com
Sat Jan 26 21:48:04 CET 2008

Raymond Hettinger wrote:
>> should the repr for a set be set({a, b, c}) 
>> instead of set([a, b, c])?
> FWIW, running eval() on the repr is slower and less memory efficient with curly braces than with the square brackets.

This is what I get.

 >>> timeit.timeit("eval('frozenset({1,2,3})')")
 >>> timeit.timeit("eval('frozenset([1,2,3])')")
 >>> timeit.timeit("eval('frozenset((1,2,3))')")
 >>> timeit.timeit("eval('set({1,2,3})')")
 >>> timeit.timeit("eval('set([1,2,3])')")
 >>> timeit.timeit("eval('set((1,2,3))')")

It's all very close.  I think the frozenset({1,2,3}) example will get 
faster if {..} notation becomes a frozen set, and set({...}) example will 
slow down a bit.

> Also, it may be easily misread as meaning: set([frozenset([a, b, c])]).  If the latter is intended, then that would become set({{a, b, c}}) which I find hard to parse correctly.  Maybe the set([a, b, c]) form should live on.
> Raymond

You added an extra level of nesting.  set(frozenset([a, b, c])) isn't any 
harder to parse (to me) than the equivalent tuple or list versions of the 
same forms: list(tuple([a, b, c]) and tuple(list([a, b, c]).


More information about the Python-3000 mailing list