python - 为什么方法这么慢?

标签 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 内部实际调用交集方法的地方不应该有再次查找(它只是重复使用相同的方法引用)。

有人可以指出我的理解有缺陷吗?

最佳答案

这与方法绑定(bind)等完全无关。第一个版本在每次迭代中计算三个集合的交集,而第二个版本只计算两个集合的交集。如果我们改用显式循环,这一点很容易看出。

变体 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)

关于python - 为什么方法这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9486736/

相关文章:

检查(断言)有效日期失败

python - 如何将一个数组的顺序复制到另一个数组中? [Python]

python - Groupby 与行索引操作?

python - 从 SWIGged Python 中的 C++ 基类派生

python - 从字符串中提取出现在关键字之前的单词/句子 - Python

javascript - <li> 具有 onclick(开关/复选框)功能

python - 如何将 key 输入终端以进行单元测试

php - 用PHP执行mysql "create function"语句

c - 如何返回到 main 而不是调用它的函数?

c - 将变量设置为函数的返回类型