我正在编写代码并且效率非常重要。 实际上我需要2d数组,我在for循环中填充0和1。什么更好,为什么?
制作空数组并用" 0"填充它和" 1"。它的伪代码,我的阵列会更大。
使用零填充数组并使if()如果不为零 - 放一个。
所以我需要更有效的信息: 1.把每个元素放在#34; 0"和" 1"清空数组 要么 2.制作if()(' if'的效率)然后只放" 1"元件。
答案 0 :(得分:2)
我会选择零()。无论如何,性能瓶颈将是你的python for循环。
幸运的是,Numpy现在是一个JIT编译器,它可以将你的蹩脚和慢速python for循环转换成机器代码:
我试了一下。它的边缘有点粗糙,但与裸蟒蛇代码相比,加速可以非常壮观。当然最好的选择是使用numpy进行矢量化,但你并不总是有选择。
答案 1 :(得分:1)
Ae = np.empty(10000)
A0 = np.zeros((10000)
初始分配内存的方式略有不同。但是如果你继续做像
这样的事情,时间上的任何差异都会很小for i in range(10000):
Ae[i] = <some calc>
或
for i in range(10000):
val = <some calc>
if val>0:
A0[i] = val
如果我必须这样循环,我会继续使用np.zeros
,并使用无条件分配。它使代码更简单,并且与正在发生的所有其他内容相比,时间差异将很小。
抽样时间:
In [33]: def foo0(N):
...: A = np.empty(N,int)
...: for i in range(N):
...: A[i] = np.random.randint(0,2)
...: return A
...:
In [34]: def foo1(N):
...: A = np.zeros(N,int)
...: for i in range(N):
...: val = np.random.randint(0,2)
...: if val:
...: A[i] = val
...: return A
...:
分配10 0/1值的3种方法
In [35]: foo0(10)
Out[35]: array([0, 0, 1, 0, 0, 1, 0, 1, 1, 0])
In [36]: foo1(10)
Out[36]: array([0, 1, 1, 1, 1, 1, 1, 1, 0, 0])
In [37]: np.random.randint(0,2,10)
Out[37]: array([0, 1, 1, 0, 1, 1, 1, 0, 0, 1])
次:
In [38]: timeit foo0(1000)
100 loops, best of 3: 4.06 ms per loop
In [39]: timeit foo1(1000)
100 loops, best of 3: 3.95 ms per loop
In [40]: timeit np.random.randint(0,2,1000)
... cached.
100000 loops, best of 3: 13.6 µs per loop
2个循环时间几乎相同。
答案 2 :(得分:1)
最好创建零数组并使用if-else填充它。即使条件会使代码变慢,重新整形空数组或将其与新向量连接,每次循环迭代操作都会更慢,因为每次创建新大小的新数组并将旧数组与新向量值一起复制到值。 / p>