Я нашел эту ветку несколько дней назад и повторно написал решение nibot , и, сократив количество итераций пополам и выполняя некоторые другие незначительные улучшения производительности, я смог улучшить производительность с помощью фактор ~ 2.4:
def isqrt(n):
a = 0 # a is the current answer.
r = 0 # r is the current remainder.
for s in reversed(range(0, n.bit_length(), 2)): # Shift n by s bits.
t = n >> s & 3 # t is the two next most significant bits of n.
r = r << 2 | t # Increase the remainder as if no new bit is set.
c = a << 2 | 1 # c is an intermediate value used for comparison.
b = r >= c # b is the next bit in the remainder.
if b:
r -= c # b has been set, so reduce the remainder.
a = a << 1 | b # Update the answer to include b.
return (a, r)
Вот результаты из timeit
:
>>> timeit('isqrt(12345678901234567890)', setup='from __main__ import isqrt')
8.862877120962366
Затем для сравнения я применил наиболее часто используемый алгоритм с квадратным корнем: Метод Ньютона . Это определение гораздо более компактно.
def isqrt(n):
x, y = n, n >> 1
while x > y:
x, y = y, (y + n//y) >> 1
return (x, n - x*x)
Оказывается, что даже оптимизированная версия длинномерных квадратных корней медленнее метода Ньютона, занимая примерно в 1,5 раза.
>>> timeit('isqrt(12345678901234567890)', setup='from __main__ import isqrt')
5.74083631898975
Итак, в заключение, если вам нужна быстрая чистая функция квадратного корня Python, посмотрите не дальше, чем приведенная выше.
Изменить: я исправил ошибку в методе Ньютона выше. На моей машине он работает на ~ 10% быстрее, чем user448810. .
CategoricalNB
scikit-учатся, новый класс, который будет добавлен в naive_bayes модуле. Это находится в ночной сборке здесь .
Смешанный Наивный Байесов ( https://github.com/remykarem/mixed-naive-bayes). Это может принять соединение Гауссовых и категориальных (multinoulli) дистрибутивов на функциях обучающих данных. Библиотека записана таким образом, что API подобны scikit-learn's.
from mixed_naive_bayes import MixedNB
X = [[0, 0],
[1, 1],
[2, 1],
[1, 1],
[0, 2]]
y = [0, 0, 1, 1, 0]
clf = MixedNB(categorical_features='all')
clf.fit(X,y)
clf.predict(X)
Посмотрите мой ответ в подобном вопросе здесь https://stackoverflow.com/a/58428035/4570466.