我参考了这个问题,特别是来自@David Robinson和@mgilson的第一个答案下面的评论:Sum the second value of each tuple in a list
原始问题是要对列表中每个元组的第二个值求和:
structure = [('a', 1), ('b', 3), ('c', 2)]
首先回答:
sum(n for _, n in structure)
第二个答案:
sum(x[1] for x in structure)
根据讨论,第一个答案要快50%。
当我弄清楚第一个答案的操作(来自Perl,我搜索了一下在python中特殊的“_”变量的含义),我想知道为什么那些看起来只是纯子集任务的操作(获取每个元组的第二个元素而不是获取并绑定两个元素到变量中)却更慢?这是在Python中优化索引访问的机会缺失了吗?还是我漏掉了第二个答案需要耗费时间的操作?
BINARY_SUBSCRIPT
在查找后将是非常高效的操作,而UNPACK_SEQUENCE
则不是(可以看作O(1)与O(n)),并且下标操作需要少一次存储操作。实际上,您对代码的格式化可能会产生误导-两个操作使用相同数量的操作码,并且您实际上没有解释为什么拆包比下标引用更快:特别是,为什么拆包不需要通过PyObject_GetItem
进行方法查找? - Konrad Rudolph