Факториал в numpy и scipy
Как я могу импортировать факториальную функцию из numpy и scipy отдельно, чтобы узнать, какой из них быстрее?
Я уже импортировал факториал из самого python по математике импорта. Но это не работает для numpy и scipy.
Ответы
Ответ 1
Вы можете импортировать их следующим образом:
In [7]: import scipy, numpy, math
In [8]: scipy.math.factorial, numpy.math.factorial, math.factorial
Out[8]:
(<function math.factorial>,
<function math.factorial>,
<function math.factorial>)
scipy.math.factorial
и numpy.math.factorial
кажутся просто псевдонимами/ссылками для /to math.factorial
, то есть scipy.math.factorial is math.factorial
и numpy.math.factorial is math.factorial
должны давать True
.
Ответ 2
Ответ для Ашвини велик, указывая, что scipy.math.factorial
, numpy.math.factorial
, math.factorial
- одни и те же функции. Однако я бы рекомендовал использовать тот, о котором говорила Жанна, что scipy.misc.factorial
отличается. Один из scipy может принимать np.ndarray
как вход, а другие не могут.
In [12]: import scipy.misc
In [13]: temp = np.arange(10) # temp is an np.ndarray
In [14]: math.factorial(temp) # This won't work
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-14-039ec0734458> in <module>()
----> 1 math.factorial(temp)
TypeError: only length-1 arrays can be converted to Python scalars
In [15]: scipy.misc.factorial(temp) # This works!
Out[15]:
array([ 1.00000000e+00, 1.00000000e+00, 2.00000000e+00,
6.00000000e+00, 2.40000000e+01, 1.20000000e+02,
7.20000000e+02, 5.04000000e+03, 4.03200000e+04,
3.62880000e+05])
Итак, если вы делаете факториал в np.ndarray, то из scipy будет легче кодировать и быстрее, чем делать for-loops.
Ответ 3
SciPy имеет функцию scipy.special.factorial
(ранее scipy.misc.factorial
)
>>> import math
>>> import scipy.special
>>> math.factorial(6)
720
>>> scipy.special.factorial(6)
array(720.0)
Ответ 4
from numpy import prod
def factorial(n):
print prod(range(1,n+1))
или с mul от оператора:
from operator import mul
def factorial(n):
print reduce(mul,range(1,n+1))
или полностью без помощи:
def factorial(n):
print reduce((lambda x,y: x*y),range(1,n+1))
Ответ 5
Вы можете сохранить некоторые самодельные факториальные функции на отдельном модуле utils.py, а затем импортировать их и сравнить производительность с предопределенным, в scipy, numpy и math с использованием timeit.
В этом случае я использовал в качестве внешнего метода последний предложенный Стефаном Грюнвальдом:
import numpy as np
def factorial(n):
return reduce((lambda x,y: x*y),range(1,n+1))
Основной код (я использовал фреймворк, предложенный JoshAdel в другом сообщении, ищите как-can-i-get-an-array-of-alternating-values-in-python):
from timeit import Timer
from utils import factorial
import scipy
n = 100
# test the time for the factorial function obtained in different ways:
if __name__ == '__main__':
setupstr="""
import scipy, numpy, math
from utils import factorial
n = 100
"""
method1="""
factorial(n)
"""
method2="""
scipy.math.factorial(n) # same algo as numpy.math.factorial, math.factorial
"""
nl = 1000
t1 = Timer(method1, setupstr).timeit(nl)
t2 = Timer(method2, setupstr).timeit(nl)
print 'method1', t1
print 'method2', t2
print factorial(n)
print scipy.math.factorial(n)
Что обеспечивает:
method1 0.0195569992065
method2 0.00638914108276
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
Process finished with exit code 0
Ответ 6
![enter image description here]()
после запуска различных вышеупомянутых функций для факториала, разными людьми, оказывается, что математический факториал является самым быстрым для вычисления факториала.
найти время выполнения для различных функций в прикрепленном изображении