[英]Faster way to convert list of objects to numpy array
我正在尝试通过使用 numpy 数组删除 for 循环和列表理解来优化我的代码。 总的来说,现在代码的执行速度更快了,但是有一件事情让我很困扰:将我的包含大约 110000 个元素的列表转换为一个 numpy 数组需要程序运行时的大部分时间(5 到 7 秒,只是为了初始化一个数组!)
我有这个
rec = np.array(records)
其中records
是对象列表。
是否可以加快创建这个 numpy 数组的速度?
如果您的列表是一维的,则使用np.fromiter()
比典型的np.array()
更快。 大小为 10000 的整数列表的基准测试:
a = [1,2,3,4,5,6,7,8,9,10]*1000
%timeit np.array(a,dtype=np.int32)
456 µs ± 7.16 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.fromiter(a,dtype=np.int32,count=10000)
242 µs ± 6.65 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
python 存储对象(例如记录中的项目)的方式与 numpy 不同。 因此,为了创建 numpy 数组,需要访问每个元素然后进行转换。
正如@anmol_uppoal 的评论所暗示的那样,您应该希望从一开始就创建一个 numpy 数组。 例如
rec = np.zeros((SIZE_OF_ARRAY,))
# Set values of rec in the same way you created records, for instance
for i in range(100):
rec[i] = i+1
获得进一步优化将与数据的来源相关联——如果来自文件,请尝试以 numpy 格式而不是文本格式存储。 如果是数据库,请考虑保存二进制值(但这在很大程度上取决于应用程序的其余部分)
在读取数据时,它通常不会以 numpy 数组的形式出现。 具有绑定 java 或 python 的 netcdf 库,用于处理 HDF5 或变体中的多变量、多文件数据集。 它使用内部优化的数组类型,而不是 numpy 类型,因此转换是不可避免的。
例如,从 netcdf 数据集转换需要几分钟。 逐步计时显示这只是需要时间的转换
with CodeTimer("convert np.array"): tcc_obs = np.asarray(tcc_obs)
对于一个形状数组:(725, 759, 96) ~53 M 个元素代码块“convert np.array”需要:161 s
如果有人有办法让它变得更好。 从逻辑上讲,最好用布尔数组对 netcdf 变量进行子集化,然后转换一个较小的数组,但代码使用一些 numpy 函数作为 isin 来查找两个表中的公共索引,我不知道 python 数组的等效项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.