首页 > 解决方案 > 比较 python 阶乘的性能(数学与 scipy)

问题描述

为什么math.factorial比 快那么多scipy.special.factorial

import timeit

t = timeit.timeit("from math import factorial; factorial(20)"); print(t)
0.6399730000412092

t = timeit.timeit("from scipy.special import factorial; factorial(20)"); print(t)
5.339432950946502

t = timeit.timeit("from scipy.special import factorial; factorial(20, exact=True)"); print(t)
1.7984685270348564

我在 Python 3.7 上(scipy 版本是 1.1.0)

标签: pythonfactorial

解决方案


这是一个常见的错误,类似于期望np.exp()math模块工作得更快的事情。这不是此类功能的目的。科学堆栈(NumPyPandasSciPy其他)关注的是跨数组的向量化方法,而不是单个值。

from math import factorial

factorial([20, 20, 20])

这会给TypeError: an integer is required (got type list)

但:

from scipy.special import factorial

factorial([20, 20, 20])

将计算整个列表的阶乘,给出:

array([2.43290201e+18, 2.43290201e+18, 2.43290201e+18])

如果您将math.factorial计算放入一个for循环中以涵盖列表中的多个项目,那么与矢量化方法相比,它会很快落后于时间(如果您首先提供 NumPy 数组而不是列表,这会更快)


推荐阅读