首页 > 解决方案 > NumPy:可让我访问数组的“vectorize”的替代方案

问题描述

我有这个代码:

output_array = np.vectorize(f, otypes='d')(input_array)

我想用这段代码替换它,它应该给出相同的输出:

output_array = np.ndarray(input_array.shape, dtype='d')
for i, item in enumerate(input_array):
    output_array[i] = f(item)

我想要第二个版本的原因是我可以output_array在一个单独的线程中开始迭代,同时计算它。(是的,我知道 GIL,这部分已经处理好了。)

不幸的是,for循环非常慢,即使我没有在单独的线程上处理数据。我在我的目标平台 CPython 和 PyPy3 上对它进行了基准测试。在 CPython 上比 慢 3 倍vectorize,在 PyPy3 上比vectorize!慢 67 倍。

尽管 Numpy 文档说“vectorize提供该函数主要是为了方便,而不是为了性能。实现本质上是一个 for 循环”。

知道为什么我的实现很慢,以及如何快速实现仍然允许我output_array在完成之前使用吗?

标签: pythonnumpypypy

解决方案


Sebastian Berg 给了我一个解决方案。迭代输入数组中的项目时,使用item.item()而不仅仅是item. 这会将numpy.float64对象变成普通的 Python 浮点数,让一切变得更快并解决我的特定问题:)


推荐阅读