3 ms·
This makes me wonder, couldn't python have a peephole optimization that replaces certain easy labmdas like this with operator functions? Maybe it's too noticeab
by kzrdude 4y ago
This makes me wonder, couldn't python have a peephole optimization that replaces certain easy labmdas like this with operator functions? Maybe it's too noticeable to work as a transparent optimization (function kind and name etc changes).
- winstonewert 4y agoSuch optimizations can't be transparent in python (at least not easily) because you could very well reassigned everything in `operator` to do whatever you want. PyPy can do it with its jit because it supports invalidating compiled code when such changes are made.
- eesmith 4y agoAssuming the implementation has access to the "real" operator.itemgetter, I can't think of a case where lambda x: x['name'] cannot be replaced by a operator.itemgetter("name") and get a different result. ... except for the stack trace: >>> f = lambda x: x["A"] >>> f({"A": 3}) 3 >>> f({"B": 3}) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <lambda> KeyError: 'A' >>> import operator >>> f = operator.itemgetter("A") >>> f({"A": 3}) 3 >>> f({"B": 3}) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'A' So if 'x' implemented its own getitem and it inspected the stack (eg, how Pandas uses the 'level' parameter in 'eval' and 'query' methods to get locals() and globals()), then this change would cause different results.
- winstonewert 4y agoOh, I see. I think you are right.