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 秒的差异,同样 []
更快。
你好,我找不到使用方括号来理解列表与使用 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 秒的差异,同样 []
更快。