2016-02-11 103 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