将对象列表转换为 numpy 数组的更快方法

mor*_*ens 3 python arrays numpy

我正在尝试通过使用 numpy 数组删除 for 循环和列表理解来优化我的代码。总的来说,现在代码的执行速度更快了,但是有一件事情让我很困扰:将我的包含大约 110000 个元素的列表转换为 numpy 数组需要程序运行时的大部分时间(5 到 7 秒,只是为了初始化一个数组!)

我有这个

rec = np.array(records)
Run Code Online (Sandbox Code Playgroud)

哪里records是对象列表。

是否可以加快创建这个 numpy 数组的速度?

Sye*_*aad 7

如果您的列表是一维的,则使用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)
Run Code Online (Sandbox Code Playgroud)


rob*_*ton 3

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
Run Code Online (Sandbox Code Playgroud)

获得进一步的优化将与数据的来源相关联——如果来自文件,请尝试以 numpy 格式而不是文本格式存储。如果是数据库,请考虑保存二进制值(但这在很大程度上取决于应用程序的其余部分)