Вы действительно не говорите, что Вы подразумеваете "под лучшим алгоритмом", но как под тем, который Вы представляете, совершенно ясно (если несколько испорчено), я предположу, что Вы после более эффективного алгоритма.
Larry Gritz дал то, что является, вероятно, самым эффективным c/c ++ алгоритм без издержек взгляда таблица, и это было бы достаточно в большинстве случаев (см. http://www.hackersdelight.org для подобных алгоритмов).
, Как упомянуто в другом месте большинство центральных процессоров в эти дни имеет машинные команды для подсчета, количество продвижения обнуляет (или эквивалентно возвратитесь, набор мс укусил), однако, их использование является непортативным и - в большинстве случаев - не стоящий усилия.
Однако большинство компиляторов имеет "внутренние" функции, которые позволяют использование машинных команд, но более портативным способом.
Microsoft C ++ имеет _BitScanReverse (), и gcc обеспечивает __ builtin_clz (), чтобы сделать объем работы эффективно.
Из моего чтения документации я думаю, что есть две проблемы:
Я предлагаю создать функцию, которая принимает QuerySet и применяет к нему нужный фильтр. Затем это можно использовать всякий раз, когда вы перейдете к QS элементов и захотите обработать их дальше.