1
4
当你试图优化一个函数时,你应该知道这个函数的瓶颈是什么——没有它,你会花很多时间在错误的方向上运行。
让我们使用python函数作为基线(实际上我使用
我们应该问自己的第一个问题是:这个任务是内存还是CPU受限?显然,这是一项内存受限的任务——与所需的内存读写访问相比,减法算不了什么。 这意味着,所有这些我们都必须优化内存布局,以减少缓存未命中。根据经验,我们的内存访问应该一个接一个地访问连续的内存地址。
是这样吗?不,阵列
不是连续的。另一方面
将是连续访问。让我们改变信息存储的方式
现在的计时是:
还有两个小的改进:我们不必用零初始化结果,我们可以节省一些python开销,但这只给了我们大约5%:
现在,这大约比原始版本快8倍。 您可以使用Cython来进一步加快速度,但任务可能仍然是内存受限的,所以不要期望它明显更快,毕竟Cython无法使内存更快地工作。然而,如果没有适当的评测,很难说有多少改进是可能的——如果有人能想出一个更快的版本,那也就不足为奇了。 |
serlingpa · 如何准备我的数据以避免无法推断频率 1 年前 |
Guillaume · 使用操作从Python列表创建numpy数组 2 年前 |
mikanim · 改进二维余弦函数的numpy功能 2 年前 |
Klimt865 · 在Python中将数组列表转换为列表列表 2 年前 |
Lynn · 如果列包含Python中的特定字符串,则从列中删除值 2 年前 |
Jan Hrubec · 选择numpy数组的前n个元素 2 年前 |