如何移除for循环中使用可变索引创建数组的矢量化



我正在尝试矢量化创建一个数组,该数组具有随循环变量而变化的变量索引。在下面的代码片段中,我希望删除for循环并对数组创建进行矢量化。有人能帮忙吗?

#矢量化1

def abc(x):
return str(x)+'_variable'
ar = []
for i in range(0,100):
ar += [str('vectorize_')+abc(i)]

您不会从";矢量化";不幸的是,因为你在处理字符串。由于这个限制,一个纯粹的Python理解能力几乎是你所能得到的"矢量化的";只有当数据是数字时,操作才能利用优化的数字C代码。

这里有一个你可以在这里做你想做的事情的方法的例子:

In [4]: %timeit np.char.add(np.repeat("vectorize_variable_", 100), np.arange(100).astype(str))
108 µs ± 1.79 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

与纯粹的Python理解:

In [5]: %timeit [f"vectorize_variable_{i}" for i in range(100)]
11.1 µs ± 175 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

据我所知,在处理字符串时,使用numpy并不能带来任何性能优势。当然,我可能错了,如果我错了,我会很高兴的。

如果你仍然不相信,下面是n=10000:的相同测试

In [6]: %timeit [f"vectorize_variable_{i}" for i in range(n)]
1.21 ms ± 23.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [7]: %timeit np.char.add(np.repeat("vectorize_variable_", n), np.arange(n).astype(str)
...: )
9.97 ms ± 40.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

纯Python的速度大约是"Python"的10倍;矢量化的";版本

最新更新