我相信这比前面提到的其他纯python方法要快:from math import factorial
from operator import mul
def n_choose_k(n, k):
if k < n-k:
return reduce(mul, xrange(n-k+1, n+1)) // factorial(k)
else:
return reduce(mul, xrange(k+1, n+1)) // factorial(n-k)
与numpy解决方案相比,它的速度很慢,但请注意numpy并不像Python那样在“无限整数”中工作。这意味着,虽然速度很慢,但Python将设法返回正确的结果。NumPy的默认行为对于组合数学来说并不总是理想的(至少在涉及非常大的整数时不是这样)。
例如In [1]: from scipy.misc import comb
In [2]: from scipy.special import binom
In [3]: %paste
from math import factorial
from operator import mul
def n_choose_k(n, k):
if k < n-k:
return reduce(mul, xrange(n-k+1, n+1)) // factorial(k)
else:
return reduce(mul, xrange(k+1, n+1)) // factorial(n-k)
## -- End pasted text --
In [4]: n_choose_k(10, 3), binom(10, 3), comb(10,