我想加快我的代码的一部分,涉及循环和设置一个大的二维数组中的值。其中一个建议是,我尝试预先分配数组而不是使用.append(),但它指出在Python中,.append()是一个摊销O(1)操作。为什么.append()比在预分配数组中设置值慢?
然而,当我测试使用以下代码:
import time
x = list()
z = list()
t1 = time.time()
for i in range(10000):
z.append([])
for j in range(10000):
z[i].append(0)
t1 = time.time()
for i in range(10000):
x.append([])
for j in range(10000):
x[i].append(1)
print(time.time()-t1)
t1 = time.time()
for i in range(10000):
for j in range(10000):
z[i][j] = 1
print(time.time()-t1)
我consitently得到相比〜21预先分配的阵列以3-4秒小于未预分配的阵列(〜17S )。这段代码中的基于.append()的函数花费的时间比替换预分配数组中的值要长吗?
“摊销O(1)”表示当你考虑对象的整个生命周期时,它是O(1),而不仅仅是任何追加本身,这就是你在这里做的。就像任何毫无意义的基准一样,除非你对整个项目进行简介并证明它很重要,否则这并不重要。 –
我对Python没有多少了解,但是对于大多数编程语言来说,追加到一个数组(在内存中必须是连续的)通常意味着必须腾出空间来扩展数组,这样每次追加都需要额外的时间。 –
@NicFoster:动态数组的容量很少被扩展为1,它更可能是当前容量的一半或两倍或类似的东西(这是分摊的东西来自哪里)。 –