<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Jan 2, 2016 at 10:42 PM, Nick Coghlan <span dir="ltr"><<a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="">On 3 January 2016 at 13:48, Guido van Rossum <<a href="mailto:guido@python.org">guido@python.org</a>> wrote:<br>
> Whoops, Nick already did the micro-benchmarks, and showed that creating a<br>
> function object is faster than instantiating a class. He also measured the<br>
> size, but I think he forgot that sys.getsizeof() doesn't report the size<br>
> (recursively) of contained objects -- a class instance references a dict<br>
> which is another 288 bytes (though if you care you can get rid of this by<br>
> using __slots__).<br>
<br>
</span>You're right I forgot to account for that (54 bytes without __slots__<br>
did seem surprisingly small!), but functions also always allocate<br>
f.__annotations__ at the moment.<br>
<br>
Always allocating f.__annotations__ actually puzzled me a bit - did we<br>
do that for a specific reason, or did we just not think of setting it<br>
to None when it's unused to save space the way we do for other<br>
function attributes? (__closure__, __defaults__, etc)<br></blockquote></div><br></div><div class="gmail_extra">Where do you see that happening? The code in funcobject.c seems to indicate that it's created on demand. (And that's how I remember it always being.)<br clear="all"></div><div class="gmail_extra"><br>-- <br><div class="gmail_signature">--Guido van Rossum (<a href="http://python.org/~guido" target="_blank">python.org/~guido</a>)</div>
</div></div>