gpt4 book ai didi

python - 用 0 初始化列表然后填充与直接将项目附加到列表相比,哪种方法更有效

转载 作者:行者123 更新时间:2023-12-01 07:44:42 27 4
gpt4 key购买 nike

我看到了同一代码的两个版本,想知道哪一个版本效率更高,以及哪一个在 python 中使用更频繁。

output_list = [0 for _ in range(output_length)]
k=0
for i in range(input_length):
output_list[k] = input[i]
k += 1

第二种方法是用空列表初始化一个列表,然后一项一项地追加。在 C++ 中,我认为如果您已经知道输出长度,则前一种方法将是方法。从风格上来说,这对 python 重要吗?

output_list = []
for i in range(input_length):
output.append(input[i])

这不是我关心的实际问题,但问题是合并排序中的合并问题,其中您有一个辅助输出数组,其大小将是两半的总和。但我上面只是举了一个简单的例子。

最佳答案

首先,进行一些清理:

output_list = [0]*output_length
for i in range(input_length):
output_list[i] = input[i]

和:

output_list = []
for i in range(input_length):
output.append(input[i])

现在,Python 过度分配列表,因此 append 的复杂度为 O(1) 摊销。但即便如此,在第二种情况下,它也必须不时复制底层数组,因此最好使用第一种替代方案,它立即分配正确大小的数组。

回复评论:

[0]*n 比列表理解更简单,这既是因为可读性(没有 _ 或循环),又是因为字节码:

from dis import dis

def init():
output_list = [0 for _ in range(output_length)]
# output_list = [0]*output_length

dis(init)

第一:

4         0 LOAD_GLOBAL              0 (range)
3 LOAD_GLOBAL 1 (output_length)
6 CALL_FUNCTION 1
9 BUILD_LIST_FROM_ARG 0
12 GET_ITER
>> 13 FOR_ITER 12 (to 28)
16 STORE_FAST 0 (_)
19 LOAD_CONST 1 (0)
22 LIST_APPEND 2
25 JUMP_ABSOLUTE 13
>> 28 STORE_FAST 1 (output_list)
31 LOAD_CONST 0 (None)
34 RETURN_VALUE

第二:

5         0 LOAD_CONST               1 (0)
3 BUILD_LIST 1
6 LOAD_GLOBAL 0 (output_length)
9 BINARY_MULTIPLY
10 STORE_FAST 0 (output_list)
13 LOAD_CONST 0 (None)
16 RETURN_VALUE

关于python - 用 0 初始化列表然后填充与直接将项目附加到列表相比,哪种方法更有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56518567/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com