Python :理解列表,方括号 vs list()

Python : comprehension list, square brackets vs list()

你好,我找不到使用方括号来理解列表与使用 list()

之间的区别

是否存在性能/内存分配差异?

(set 和 dict 同样的问题)

input = [1, 2, 3, 4]

B = [a * 2 for a in input if a > 1]

C = list(a * 2 for a in input if a > 1)

B_set = {str(a) for a in input if a > 1}

C_set = set(str(a) for a in input if a > 1)

B_dict = {str(a):a for a in input if a > 1}

C_dict = dict(str(a):b for a,b in input if a > 1) # NOT LEGAL

感谢您的帮助

[]list() 快得多,因为 [] 文字 意味着 python 直接编译并创建字节码,而列表() 是 object 在创建字节码之前需要名称解析、堆栈分配等。

您可以使用timeit模块测量速度。

例如:

from timeit import timeit

lst = [1, 2, 3, 4] * 100

def fn1():
    return [a * 2 for a in lst if a > 1]

def fn2():
    return list(a * 2 for a in lst if a > 1)

t1 = timeit(lambda: fn1(), number=10_000)
t2 = timeit(lambda: fn2(), number=10_000)

print(t1)
print(t2)

打印(AMD 2400G,Python 3.8):

0.2406109299918171
0.2905043710197788

所以列表理解更快。

我们可以通过 -mtimeit.

查看
$ python -mtimeit "B = [a * 2 for a in list(range(1000)) if a > 1]"
5000 loops, best of 5: 86.7 usec per loop
$ python -mtimeit "B = list(a * 2 for a in list(range(1000)) if a > 1)"
2000 loops, best of 5: 110 usec per loop
$ python -mtimeit "B = list(a * 2 for a in list(range(1000)) if a > 1)"
2000 loops, best of 5: 110 usec per loop
$ python -mtimeit "B = {str(a): a for a in list(range(1000)) if a > 1}"
1000 loops, best of 5: 273 usec per loop
$ python -mtimeit "B = set(str(a) for a in list(range(1000)) if a > 1)"
1000 loops, best of 5: 287 usec per loop

所以,如您所见,没有太大的区别。

有了更大的列表,我们有:

$ python -mtimeit "B = [a * 2 for a in list(range(100000)) if a > 1]"
20 loops, best of 5: 11.1 msec per loop
$ python -mtimeit "B = list(a * 2 for a in list(range(100000)) if a > 1)"
20 loops, best of 5: 14.2 msec per loop

我们看到 3 毫秒的差异,对于 [] 情况更好。

有了更大的数字列表,我们有

$ python -mtimeit "B = [a * 2 for a in list(range(10000000)) if a > 1]"
1 loop, best of 5: 1.21 sec per loop
$ python -mtimeit "B = list(a * 2 for a in list(range(10000000)) if a > 1)"
1 loop, best of 5: 1.49 sec per loop

我们看到 0.28 秒的差异,同样 [] 更快。