python - 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
在完成之前使用吗?
解决方案
Sebastian Berg 给了我一个解决方案。迭代输入数组中的项目时,使用item.item()
而不仅仅是item
. 这会将numpy.float64
对象变成普通的 Python 浮点数,让一切变得更快并解决我的特定问题:)
推荐阅读
- excel - 将文本分隔到最后一行的列在 VBA Excel 中不起作用
- python - 张量必须具有相同的维数:得到 2 和 3
- javascript - 我怎样才能得到这个 javascript 函数的结果并执行正确的存储过程?
- c - 在 C 中的 Socket 中读取输入并保存在共享内存中
- javascript - JSON - 获取特定元素
- xslt - XSLT:如果元素在元素中包含“xmlns”,则不会转换 xml 元素,
- git - 无法在测试分支中重新设置主控
- ansible - Ansible 动作插件使用带标签的角色
- python-3.x - 每次使用 Selenium 滚动后,如何从动态加载的网页中提取文本?
- c++ - 指向函数本地结构的指针的范围和生存期