使用Python和Numpy有效地计算factorial

时间:2016-02-11 00:55:12

标签: python numpy factorial

在python / numpy中 - 有没有办法构建一个包含factorial的表达式 - 但是在我的场景中,许多因子将被复制或减少,等到我指示运行时计算它。

我们说F(x) := x!

我构建了一个像(F(6) + F(7)) / F(4)这样的表达式 - 我可以大大加快这一点,甚至可以通过这样做来做到这一点

(F(6) * (1 + 7)) / F(4)
 = 5 * 6 * 8
 = 240

基本上,我将生成这样的表达式,并希望计算机是智能的,而不是通过乘以1来计算所有因子,即使用我的例子实际上并不是

(6*5*4*3*2 + 7*6*5*4*3*2) / 4*3*2

我实际上已经开始开发一个Factorial类,但我是python和numpy的新手,并且想知道这是否已经解决了。

2 个答案:

答案 0 :(得分:4)

正如@Oleg建议的那样,你可以用sympy做到这一点:

import numpy as np
import sympy as sp

# preparation
n = sp.symbols("n")
F = sp.factorial

# create the equation
f = (F(n) + F(n + 1)) / F(n - 2)
print(f)               # => (factorial(n) + factorial(n + 1))/factorial(n - 2)

# reduce it
f = f.simplify()
print(f)               # => n*(n - 1)*(n + 2)

# evaluate it in SymPy
# Note: very slow!
print(f.subs(n, 6))    # => 240

# turn it into a numpy function
# Note: much faster!
f = sp.lambdify(n, f, "numpy")
a = np.arange(2, 10)
print(f(a))            # => [  8  30  72 140 240 378 560 792]

答案 1 :(得分:2)

如果空间效率不是一个主要问题,也许您可​​以考虑使用表格查找来提高效率。这将大大减少重复计算的次数。以下并不是非常有效,但它是基本的想法。

cache = {1:1}
def cached_factorial(n):
    if (n in cache):
        return cache[n]
    else:
        result = n * cached_factorial(n-1)
        cache[n] = result
        return result