Python 将对象列表转换为numpy数组的更快方法
我试图通过使用numpy数组删除for循环和列表理解来优化代码。 一般来说,现在代码的执行速度更快了,但有一件事让我非常困扰:将包含大约110000个元素的列表转换为numpy数组需要花费程序运行时的大部分时间(5到7秒,只是初始化数组!) 我有这个Python 将对象列表转换为numpy数组的更快方法,python,arrays,numpy,Python,Arrays,Numpy,我试图通过使用numpy数组删除for循环和列表理解来优化代码。 一般来说,现在代码的执行速度更快了,但有一件事让我非常困扰:将包含大约110000个元素的列表转换为numpy数组需要花费程序运行时的大部分时间(5到7秒,只是初始化数组!) 我有这个 rec = np.array(records) 其中记录是对象列表 有没有可能加快这个numpy数组的创建速度?python存储对象(例如记录中的项)的方式与numpy不同。因此,为了创建numpy数组,需要访问每个元素,然后进行转换 正如@an
rec = np.array(records)
其中记录
是对象列表
有没有可能加快这个numpy数组的创建速度?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格式而不是文本格式存储。如果一个数据库,考虑保存二进制值(但是这在很大程度上取决于应用程序的其余部分) 如果你的列表是一维的,使用<代码> NP.FrutMeMe()/>代码比典型的<代码> NP.ARARY()/<代码>要快。 大小为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)
读取数据时,它通常不是numpy数组。netcdf库,具有java或python绑定,用于处理HDF5或变体中的多变量、多文件数据集。它使用内部优化的数组类型,但不是numpy类型,因此转换是不可避免的 例如,从netcdf数据集转换需要几分钟的时间。 逐步计时表明,这只是需要时间的转换 使用CodeTimer(“convert np.array”):tcc_obs=np.asarray(tcc_obs) 对于一个形状阵列:(72575996)~53m元素 代码块“convert np.array”耗时:161秒
如果有人有办法做得更好。从逻辑上讲,最好使用布尔数组子集netcdf变量,然后转换一个较小的数组,但是代码使用一些numpy函数作为isin来查找两个表中的公共索引,这对于python数组来说是没有等价物的。为什么要先创建一个列表,然后将其转换为numpy数组,如果可能的话,创建一个numpy数组,因为数据来自django中的sqlite数据库,所以我得到的记录在一个QuerySet中…可能类似于这些记录是什么样的?