gpt4 book ai didi

python - 使用 View 使数组迭代更快

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:22 24 4
gpt4 key购买 nike

如果我有一个大的 numpy 数组 x 我可以加快许多迭代操作的速度,例如代替写入

x[1:-1] = 5*x[1:-1]

我可以使用

x[1:-1] *= 5

这更快,因为与第一个示例相比,它避免了不必要地创建具有值 5*x[1:-1] 的附加数组。

我的问题是:是否有可能加速像这样的更通用的迭代

x[1:-1] = 5*x[1:-1] + x[:-2]

以类似的方式?到目前为止我只想到了

x[1:-1] = x[:-2]
x[1:-1] += 5*x[2:]

但这仍然会创建副本,我想知道是否有办法变得更快。

最佳答案

有时你只需要临时的 arryas,并且不能重写

x[1:-1] += 5*x[2:]

作为 View 上的操作。

当您需要临时数组时,与就地计算的模拟是创建一些临时数组并将其用于计算每个阶段的输出。您仍然需要更多的指针数学知识,但是您不必在内存中多次创建空间。然后你可以将上面的行重写为:

np.multiply(x[2:], 5, out=temp)
x[1:-1] += temp

在这里,我假设 temp 的大小为 x[-1:1],这就是我通常为处理边界这一常见问题所做的处理。

使用就地计算,您无法多次使用 timeit 运行精确方程,因为数字呈指数增长,但这里有一个用 1x 替换 5x 的测试:

import numpy as np
from timeit import timeit

N = 100000000
x = np.arange(N, dtype=np.int)
temp = np.zeros((N-2,), dtype=np.int)

def f0(x, temp):
x[1:-1] += 1*x[2:]

def f1(x, temp):
np.multiply(x[1:-1], 1, out=temp)
x[1:-1] += temp

print timeit("f0(x, temp)", "from __main__ import f0, f1, x, temp", number=100)
print timeit("f1(x, temp)", "from __main__ import f0, f1, x, temp", number=100)

给出:

71.543628931
44.719383955

# or, for N /= 100, and number *= 10
5.37844896317
4.50015997887

对于更小的数组,out 数组方法可能会变得更慢。

关于python - 使用 View 使数组迭代更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16715457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com