python - 比较 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)
解决方案
这是一个常见的错误,类似于期望np.exp()
比math
模块工作得更快的事情。这不是此类功能的目的。科学堆栈(NumPy
、Pandas
和SciPy
其他)关注的是跨数组的向量化方法,而不是单个值。
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 数组而不是列表,这会更快)
推荐阅读
- php - Laravel 7 - 帮助添加/更新
- python - python - 如何根据python中pandas数据框中的列并按降序分组?(Jupyter 笔记本)
- ruby-on-rails - Excon::Error::Forbidden: Expected(200) <=> Actual(403 Forbidden) with rails app
- reactjs - 卸载具有反应功能的组件
- javascript - Angular 9:如何使用带有查询字符串的 route.navigate() 在新选项卡中打开 URL?
- amazon-s3 - Kafka Connect S3 Sink Flush 数据 - 奇怪的延迟
- firebase - 使用 arrayContainsAny 进行 Flutter Firestore 查询:列表不起作用
- laravel - Laravel Slack 通知附件
- sql - 在sql中合并两个查询
- ios - 在 Apple 通行证的条形码中嵌入 URL