好吧,我理解像C ++这样的语言为什么调用类中定义的虚方法比调用非虚方法慢(你必须通过动态调度表来查找正确的实现来调用)。
但是在Python中,如果我有:
list_of_sets = generate_a_list_containg_a_bunch_of_sets()
intersection_of_all = reduce(list_of_sets[0].intersection, list_of_sets)
显着(在我的实验中大约40%)慢于:
list_of_sets = generate_a_list_containg_a_bunch_of_sets()
intersection_of_all = reduce(set.intersection, list_of_sets)
我没有得到的是为什么它应该这么慢,方法查找(我认为)会在调用reduce时发生,所以reduce的内部实际调用的交集方法不应该有再次查找(它只是重用相同的方法引用)。
有人可以说明我的理解存在缺陷吗?
答案 0 :(得分:12)
这与方法绑定等完全无关。第一个版本计算每次迭代中三个集合的交集,而第二个版本仅与两个集合相交。如果我们使用显式循环,这很容易看到。
变式1:
intersection = list_of_sets[0]
for s in list_of_sets[1:]:
intersection = list_of_sets[0].intersection(intersection, s)
变式2:
intersection = list_of_sets[0]
for s in list_of_sets[1:]:
intersection = set.intersection(intersection, s)
(你现在同意Guido有意义吗?)
请注意,这可能会更快:
intersection = list_of_sets[0]
for s in list_of_sets[1:]:
intersection.intersection_update(s)