Вы можете использовать scipy.special.binom()
.
РЕДАКТИРОВАТЬ
Я не совсем уверен, почему вы не хотите использовать SciPy но у вас все в порядке с NumPy , поскольку SciPy - это хорошо зарекомендовавшая себя библиотека, созданная по существу теми же людьми, которые разрабатывают NumPy.
В любом случае, здесь есть пара других методов:
- с использованием
math.factorial
:
import math
def binom(n, k):
return math.factorial(n) // math.factorial(k) // math.factorial(n - k)
- с использованием
prod()
и math.factorial()
(теоретически более эффективно, но не на практике):
def prod(items, start=1):
for item in items:
start *= item
return start
def binom_simplified(n, k):
if k > n - k:
return prod(range(k + 1, n + 1)) // math.factorial(n - k)
else:
return prod(range(n - k + 1, n + 1)) // math.factorial(k)
- с использованием
numpy.prod()
:
import numpy as np
def binom_np(n, k):
return 1 if k == 0 or k == n else np.prod([(n + 1 - i) / i for i in range(1, k + 1)])
По скорости, scipy.special.binom()
самый быстрый и большой, но если вам нужно точнозначения, которые вы можете использовать binom()
:
%timeit scipy.special.binom(600, 298)
# 1000000 loops, best of 3: 1.56 µs per loop
print(scipy.special.binom(600, 298))
# 1.3332140543730587e+179
%timeit binom(600, 298)
# 10000 loops, best of 3: 36.5 µs per loop
print(binom(600, 298))
# 133321405437268991724586879878020905773601074858558174180536459530557427686938822154484588609548964189291743543415057988154692680263088796451884071926401665548516571367537285901600
%timeit binom_np(600, 298)
# 10000 loops, best of 3: 45.8 µs per loop
print(binom_np(600, 298))
# 1.3332140543726893e+179
%timeit binom_simplified(600, 298)
# 10000 loops, best of 3: 41.9 µs per loop
print(binom_simplified(600, 298))
# 133321405437268991724586879878020905773601074858558174180536459530557427686938822154484588609548964189291743543415057988154692680263088796451884071926401665548516571367537285901600