python - 比较 python 阶乘的性能(数学与 scipy)

标签 python factorial

为什么 math.factorialscipy.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)

最佳答案

这是一个常见的错误,类似于期望像 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 数组而不是列表,这会更快)

关于python - 比较 python 阶乘的性能(数学与 scipy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53884289/

相关文章:

用于查找二项式系数的 Bash 脚本

c - 代码错误;得到错误的求和输出

java - 阶乘表的问题

python - 使用 python 检测应用程序启动

python - 使用 Pandas 过滤列中具有唯一值的行

java - java打印阶乘计算过程

c - C 语言的 SPOJ 小阶乘程序

python - 根据数字和组 ID 扩展 pandas 数据框行 (Python 3)。

python - 如何按日期对条目进行分组并计算百分比

java - Java 与 Python 在 2D 图形、用户脚本方面的优势