Первая нота max
работает с любой итерацией.Это может быть список или генератора.Что является более эффективным, зависит от размера ваших входных данных и ваших аппаратных ограничений.Списки требуют много памяти, но выражения генератора имеют большие издержки от вызовов next
.
Приведенные ниже временные интервалы предназначены для 2 разных запусков на 4 вариациях одной и той же логики.Как видите, для очень больших l, r
выражение генератора является более эффективным, чем понимание списка, и наоборот для меньших l, r
.
starmap
, также ленивый, но избегающий выражения генератора, более эффективен, чем оба.С точки зрения непрофессионала, starmap
имеет лучшее из обоих миров, будучи ленивым и , используя оптимизированный код C для итерации.
# run 1 inputs
l, r = 10000, 15000
# run 2 inputs
l, r = 1000, 1500
%timeit maximizingXor_lc(l, r) # 2.83 s per loop, 18.2 ms per loop
%timeit maximizingXor_ge(l, r) # 2.48 s per loop, 21.5 ms per loop
%timeit maximizingXor(l, r) # 1.53 s per loop, 15.2 ms per loop
%timeit maximizingXor_zip(l, r) # 6.52 s per loop, 51.7 ms per loop
Код сравнения
from itertools import combinations, starmap
from operator import xor
def maximizingXor_lc(l, r):
return max([i^j for i in range(l, r+1) for j in range(i, r+1)])
def maximizingXor_ge(l, r):
return max(i^j for i in range(l, r+1) for j in range(i, r+1))
def maximizingXor(l, r):
return max(starmap(xor, combinations(range(l,r+1), 2)))
def maximizingXor_zip(l, r):
return max(map(xor, *zip(*combinations(range(l,r+1), 2))))
assert maximizingXor_lc(l, r) == maximizingXor(l, r)
assert maximizingXor_lc(l, r) == maximizingXor_ge(l, r)
assert maximizingXor_lc(l, r) == maximizingXor_zip(l, r)