NumPy:替代 `vectorize` 可以让我访问数组

Ram*_*hum 6 python pypy numpy

我有这个代码:

output_array = np.vectorize(f, otypes='d')(input_array)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

Ram*_*hum 1

塞巴斯蒂安·伯格给了我一个解决方案。当迭代输入数组中的项目时,请使用而item.item()不仅仅是item. 这会将numpy.float64对象转换为普通的 Python 浮点,使一切变得更快并解决我的特定问题:)