【发布时间】:2017-03-16 20:16:31
【问题描述】:
有没有办法对一个需要几个 numpy 数组并将它们放入字典列表的操作进行矢量化?
这是一个简化的示例。真实场景可能涉及更多的数组和更多的字典键。
import numpy as np
x = np.arange(10)
y = np.arange(10, 20)
z = np.arange(100, 110)
print [dict(x=x[ii], y=y[ii], z=z[ii]) for ii in xrange(10)]
我可能在xrange 调用中进行了数千或数十万次迭代。创建x、y 和z 的所有操作都是矢量化的(我的示例不像上面那么简单)。所以,只剩下 1 个 for 循环需要摆脱,我预计这会带来巨大的速度提升。
我已经尝试使用 map 和一个函数来创建 dict 和各种其他变通方法。似乎 Python for 循环是缓慢的部分(像往常一样)。由于预先存在的 API 要求,我有点坚持使用字典。然而,没有字典和记录数组或其他东西的解决方案会很有趣,但最终我认为这不适用于现有的 API。
【问题讨论】:
-
z=z[ii],好收获! -
[dict(x=x_, y=y_, z=z_) for x_, y_, z_ in zip(x, y, z)]就纯 Python 而言,这是矢量化的。 -
您是否尝试过使用列表和 dic 理解?是不是太慢了?
-
我的意思是,问题可能不在于循环的存在与否,而是列表的构造导致随着内存的增长而重复分配内存。
-
@durden2.0 仅供参考,listcomps 中的
for与 Python 的一般for关系不大。前者实际上有一个较低级别的实现,并且比后者更快。
标签: python performance numpy vectorization