我有这个代码:
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
在完成之前使用?
塞巴斯蒂安·伯格给了我一个解决方案。当迭代输入数组中的项目时,请使用而item.item()
不仅仅是item
. 这会将numpy.float64
对象转换为普通的 Python 浮点,使一切变得更快并解决我的特定问题:)
归档时间: |
|
查看次数: |
120 次 |
最近记录: |