0

您好,我找不到使用方括号进行理解列表与使用 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

谢谢您的帮助

4

3 回答 3

3

我们可以通过-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 秒的差异,再次[]更快。

于 2020-07-19T19:41:21.347 回答
2

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

所以列表理解更快。

于 2020-07-19T19:39:54.987 回答
0

[]list()因为[]is literal意味着 python 直接编译和创建字节码要快得多,而 list() 是在创建字节码之前需要名称解析、堆栈分配等的对象。

于 2020-07-19T19:36:44.723 回答