【问题标题】:Vectorization of array creation with variable indices in python - How to remove the for loop?在 python 中使用变量索引创建数组的向量化 - 如何删除 for 循环?
【发布时间】:2022-01-11 02:13:05
【问题描述】:

我正在尝试使用随循环变量变化的变量索引对数组的创建进行矢量化。在下面的代码 sn-p 中,我想删除 for 循环并将数组创建向量化。有人可以帮忙吗?

#Vectorize 1

def abc(x):
   return str(x)+'_variable'

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

【问题讨论】:

    标签: python arrays numpy for-loop


    【解决方案1】:

    不幸的是,由于您使用的是字符串,因此您不会从这里的“矢量化”中获得太多改进。由于这个限制,纯 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 比“矢量化”版本快大约 10 倍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2017-06-21
      • 2015-12-26
      相关资源
      最近更新 更多