为什么方法这么慢?

时间:2012-02-28 17:25:49

标签: python function

好吧,我理解像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的内部实际调用的交集方法不应该有再次查找(它只是重用相同的方法引用)。

有人可以说明我的理解存在缺陷吗?

1 个答案:

答案 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)