Хорошо, я понимаю на таких языках, как 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)
То, что я не получаю, почему это должно быть намного медленнее, поиск метода (я бы подумал) произошел бы при вызове для сокращения, поэтому внутренняя часть сокращения, где фактически вызывается метод пересечения, не должна снова искать (просто просто повторно используйте такой же способ ссылка).
Может ли кто-нибудь осветить, где мое понимание испорчено?
Вы видите это differenc e для многих небольших наборов или для нескольких крупных? Я ожидал, что связанные проблемы будут иметь значение в первом случае, но не в последнем (когда фактическая работа пересечения доминирует над накладными расходами). Я вижу два противоречивых ответа (один из них дважды) и не могу сказать, что правильно. – ugoren
Это было как для небольшого (список из примерно 10 наборов), так и для среды (список из 100 наборов, которые были созданы случайным образом). Причина была объяснена Свеном в его ответе ниже. –