import math
log2 = math.log(x, 2.0)
log2 = math.log2(x) # python 3.4 or later
Если все, что вам нужно, это целая часть лог-базы 2 числа с плавающей запятой, извлечение показателя степени довольно эффективно:
log2int_slow = int(math.floor(math.log(x, 2.0)))
log2int_fast = math.frexp(x)[1] - 1
Python frexp () вызывает функцию C frexp () , которая просто захватывает и настраивает показатель степени.
Python frexp () возвращает кортеж (мантисса, показатель степени). Так [1]
получает экспонентную часть. Для целых степеней 2 показатель степени на единицу больше, чем вы могли ожидать. Например, 32 хранится как 0.5x2⁶. Это объясняет - 1
выше. Также работает для 1/32, который хранится как 0.5x2⁻⁴.
Если и вход, и выход являются целыми числами, этот метод целочисленного типа может быть очень эффективным:
log2int_faster = x.bit_length() - 1
- 1
, поскольку для 2ⁿ требуется n + 1 бит. Это единственный вариант, который работает для очень больших целых чисел, например 2**10000
.
Все версии int-output будут размещать журнал в сторону отрицательной бесконечности, поэтому log₂31 равно 4, а не 5.