信不信由你,在分析了我当前的代码之后,numpy 数组还原的重复操作占用了运行时间的一大块。我现在拥有的是常见的基于视图的方法:
reversed_arr = arr[::-1]
有没有其他方法可以更有效地做到这一点,或者这只是我痴迷于不切实际的 numpy 性能的一种错觉?
原文由 nye17 发布,翻译遵循 CC BY-SA 4.0 许可协议
信不信由你,在分析了我当前的代码之后,numpy 数组还原的重复操作占用了运行时间的一大块。我现在拥有的是常见的基于视图的方法:
reversed_arr = arr[::-1]
有没有其他方法可以更有效地做到这一点,或者这只是我痴迷于不切实际的 numpy 性能的一种错觉?
原文由 nye17 发布,翻译遵循 CC BY-SA 4.0 许可协议
a[::-1]
只创建一个视图,所以它是一个恒定时间的操作(因此不会随着数组的增长而花费更长的时间)。如果你需要数组是连续的(例如,因为你正在用它执行许多向量操作), ascontiguousarray
大约和 flipud
/ fliplr
-ecd-7一样快:
生成图的代码:
import numpy
import perfplot
perfplot.show(
setup=lambda n: numpy.random.randint(0, 1000, n),
kernels=[
lambda a: a[::-1],
lambda a: numpy.ascontiguousarray(a[::-1]),
lambda a: numpy.fliplr([a])[0],
],
labels=["a[::-1]", "ascontiguousarray(a[::-1])", "fliplr"],
n_range=[2 ** k for k in range(25)],
xlabel="len(a)",
)
原文由 Nico Schlömer 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
给出原始数组的反向 视图
arr
。对原始数组arr
所做的任何更改也将在reversed_arr
中立即可见。arr
和reversed_arr
的底层数据缓冲区是 共享 的,因此创建此视图始终是即时的,并且不需要任何额外的内存分配或复制数组内容。另请参阅有关 NumPy 视图的讨论: 如何在 NumPy 数组上创建视图?
视图性能问题的可能解决方案
您重新创建视图的频率是否超出了您的需要?你应该能够做这样的事情:
我不是 numpy 专家,但这似乎是在 numpy 中做事的最快方法。如果这是您已经在做的事情,我认为您无法改进。