在Python中创建数组的最快方法

时间:2014-09-23 10:29:31

标签: python numpy

我想在Python中创建一个3D数组,填充-1。

我测试了这些方法:

import numpy as np
l = 200
b = 100
h = 30

%timeit grid = [[[-1 for x in range(l)] for y in range(b)] for z in range(h)]
1 loops, best of 3: 458 ms per loop

%timeit grid = -1 * np.ones((l, b, h), dtype=np.int)
10 loops, best of 3: 35.5 ms per loop

%timeit grid = np.zeros((l, b, h), dtype=np.int) - 1
10 loops, best of 3: 31.7 ms per loop

%timeit grid = -1.0 * np.ones((l, b, h), dtype=np.float32)
10 loops, best of 3: 42.1 ms per loop

%%timeit
grid = np.empty((l,b,h))
grid.fill(-1.0)
100 loops, best of 3: 13.7 ms per loop

很明显,最后一个是最快的。有没有人有更快的方法或至少更少的内存密集?因为它在RaspberryPi上运行。

2 个答案:

答案 0 :(得分:1)

我唯一可以想到的是,选择dtype参数时,这些方法中的任何一个都会更快,占用尽可能少的内存。

假设您不再需要int8的空间,@ RutgerKassies在评论中建议的方法在我的系统上花了这么长时间:

%timeit grid = np.full((l, b, h), -1, dtype=int8)
1000 loops, best of 3: 286 µs per loop

为了进行比较,使用相同的方法,未指定dtype(默认为int32)需要大约10倍的时间:

%timeit grid = np.full((l, b, h), -1)
100 loops, best of 3: 3.61 ms per loop

你最快的方法与np.full(有时击败它)一样快:

%%timeit
grid = np.empty((l,b,h))
grid.fill(-1)
100 loops, best of 3: 3.51 ms per loop

或将dtype指定为int8

1000 loops, best of 3: 255 µs per loop

编辑:这可能是作弊,但是,好吧......

%timeit grid = np.lib.stride_tricks.as_strided(np.array(-1, dtype=int8), (l, b, h), (0, 0, 0))
100000 loops, best of 3: 12.4 us per loop

这里发生的一切都是我们从一个长度为1的数组np.array([-1])开始,然后调整步长,以便grid 看起来像一样完全像一个数组具有所需的尺寸。

如果您需要实际数组,可以使用grid = grid.copy();这使得grid数组的创建速度与本页其他地方建议的最快方法一样快。

答案 1 :(得分:0)

这对我来说快一点。可能在RPi上有所不同。

grid = np.empty((l,b,h))
grid[...] = -1
如果它足够大,

np.int8要快得多

grid = np.empty((l,b,h), dtype=np.int8)
grid[...] = -1

%%timeit 
grid = np.empty((l,b,h), dtype=np.int8)
grid[:] = -1 
100 loops, best of 3: 6.91 ms per loop