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

Смежные вопросы