2016-02-11 69 views
4

在python/numpy中 - 是否有一种方法来构建包含阶乘因子的表达式 - 但由于在我的场景中,许多阶乘因子将被复制或减少,直到我指示运行时间来计算它。用Python和Numpy高效计算阶乘因子

比方说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很陌生,并且想知道这是否已经解决了。

+3

我认为一个象征性的引擎应该有,看看http://www.sympy.org/en/index .html – Oleg

回答

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] 
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 
+0

我正在这样做,以及在我写的自定义类:-) – Matt