Python 初始化集合
下面是一个集合理解的示例:Python 初始化集合,python,python-3.x,set,Python,Python 3.x,Set,下面是一个集合理解的示例: inp = [1,2,3,4,4,3,5] s_comp = {element for element in inp} # {1, 2, 3, 4, 5} python是否知道将下面的内容转换为立即的集合理解(跳过初始列表?),还是先进行列表理解,然后将结果列表转换为集合(换句话说,使用此符号创建集合只是浪费资源) 注意,从cProfile中,它似乎首先对后者进行列表理解。虽然它们每个都有相同的步数(我想第一个应该少一步?) >>cProfile.run(“{
inp = [1,2,3,4,4,3,5]
s_comp = {element for element in inp}
# {1, 2, 3, 4, 5}
python是否知道将下面的内容转换为立即的集合理解(跳过初始列表?),还是先进行列表理解,然后将结果列表转换为集合(换句话说,使用此符号创建集合只是浪费资源)
注意,从cProfile
中,它似乎首先对后者进行列表理解。虽然它们每个都有相同的步数(我想第一个应该少一步?)
>>cProfile.run(“{element for element in[1,2,3,4,4,3,5]}”)
在0.000秒内调用4个函数
订购人:标准名称
ncalls tottime percall cumtime percall文件名:lineno(函数)
1 0.000 0.000 0.000 0.000 :1()
1 0.000 0.000 0.000 0.000 :1()
1 0.000 0.000 0.000 0.000{内置方法builtins.exec}
>>>cProfile.run('set([1,2,3,4,4,3,5]]中元素的[element for element]))
在0.000秒内调用4个函数
订购人:标准名称
ncalls tottime percall cumtime percall文件名:lineno(函数)
1 0.000 0.000 0.000 0.000:1()#未设置列表
1 0.000 0.000 0.000 0.000 :1()
1 0.000 0.000 0.000 0.000{内置方法builtins.exec}
如果您有一个iterable,那么使用列表理解[]
而不是直接使用集合理解{}
是对资源的浪费
如果查看下面func A的字节码,您将看到Python正在构建一个列表,并将其作为参数传递给set()函数
在Func B的字节码中,Python被优化为直接构建一个集合
我使用了下面的代码来进行分析
从dis导入dis
定义a():
返回集([x代表范围(1,10)中的x)])
def b():
返回{x代表范围(1,10)内的x}
打印('Dis Func A\n')
印刷(dis(a))
打印('Dis Func B\n')
印刷(dis(b))
Dis Func A
5 0 LOAD_GLOBAL 0 (set)
2 LOAD_CONST 1 (<code object <listcomp> at 0x00000249F64B2EA0, file "c:\Projects\stack-overflow\asd.py", line 5>)
4 LOAD_CONST 2 ('a.<locals>.<listcomp>')
6 MAKE_FUNCTION 0
8 LOAD_GLOBAL 1 (range)
10 LOAD_CONST 3 (1)
12 LOAD_CONST 4 (10)
14 CALL_FUNCTION 2
16 GET_ITER
18 CALL_FUNCTION 1
20 CALL_FUNCTION 1
22 RETURN_VALUE
Disassembly of <code object <listcomp> at 0x00000249F64B2EA0, file "c:\Projects\stack-overflow\asd.py", line 5>:
5 0 BUILD_LIST 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 8 (to 14)
6 STORE_FAST 1 (x)
8 LOAD_FAST 1 (x)
10 LIST_APPEND 2
12 JUMP_ABSOLUTE 4
>> 14 RETURN_VALUE
5 0加载\u全局0(设置)
2加载常数1()
4荷载常数2('a…)
6生成函数0
8负载_全局1(范围)
10荷载常数3(1)
12负载常数4(10)
14调用函数2
16获取ITER
18调用函数1
20调用函数1
22返回值
反汇编:
5 0生成列表0
2加载速度为0(.0)
>>国际热核实验堆8(至14)4
6商店快速1(x)
8快速加载1(x)
10清单2
12跳/绝对4
>>14返回值
显示功能B
9 0 LOAD_CONST 1 (<code object <setcomp> at 0x00000249F64CE030, file "c:\Projects\stack-overflow\asd.py", line 9>)
2 LOAD_CONST 2 ('b.<locals>.<setcomp>')
4 MAKE_FUNCTION 0
6 LOAD_GLOBAL 0 (range)
8 LOAD_CONST 3 (1)
10 LOAD_CONST 4 (10)
12 CALL_FUNCTION 2
14 GET_ITER
16 CALL_FUNCTION 1
18 RETURN_VALUE
Disassembly of <code object <setcomp> at 0x00000249F64CE030, file "c:\Projects\stack-overflow\asd.py", line 9>:
9 0 BUILD_SET 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 8 (to 14)
6 STORE_FAST 1 (x)
8 LOAD_FAST 1 (x)
10 SET_ADD 2
12 JUMP_ABSOLUTE 4
>> 14 RETURN_VALUE
9 0 LOAD_CONST 1(行)
2荷载常数2('b…)
4生成函数0
6加载_全局0(范围)
8负载常数3(1)
10荷载常数4(10)
12调用函数2
14获取ITER
16调用函数1
18返回值
反汇编:
9 0生成集0
2加载速度为0(.0)
>>国际热核实验堆8(至14)4
6商店快速1(x)
8快速加载1(x)
10套加2套
12跳/绝对4
>>14返回值
它不能,因为名称set
可能已绑定到其他内容。它首先进行列表理解,然后在列表上使用set()
来消除重复项。但是看起来你只需要做{1,2,3,4,4,3,5}
就可以节省一个步骤,你可以使用timeit
查看情况,以及更短的时间{}
和列表comp+set
5 0 LOAD_GLOBAL 0 (set)
2 LOAD_CONST 1 (<code object <listcomp> at 0x00000249F64B2EA0, file "c:\Projects\stack-overflow\asd.py", line 5>)
4 LOAD_CONST 2 ('a.<locals>.<listcomp>')
6 MAKE_FUNCTION 0
8 LOAD_GLOBAL 1 (range)
10 LOAD_CONST 3 (1)
12 LOAD_CONST 4 (10)
14 CALL_FUNCTION 2
16 GET_ITER
18 CALL_FUNCTION 1
20 CALL_FUNCTION 1
22 RETURN_VALUE
Disassembly of <code object <listcomp> at 0x00000249F64B2EA0, file "c:\Projects\stack-overflow\asd.py", line 5>:
5 0 BUILD_LIST 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 8 (to 14)
6 STORE_FAST 1 (x)
8 LOAD_FAST 1 (x)
10 LIST_APPEND 2
12 JUMP_ABSOLUTE 4
>> 14 RETURN_VALUE
9 0 LOAD_CONST 1 (<code object <setcomp> at 0x00000249F64CE030, file "c:\Projects\stack-overflow\asd.py", line 9>)
2 LOAD_CONST 2 ('b.<locals>.<setcomp>')
4 MAKE_FUNCTION 0
6 LOAD_GLOBAL 0 (range)
8 LOAD_CONST 3 (1)
10 LOAD_CONST 4 (10)
12 CALL_FUNCTION 2
14 GET_ITER
16 CALL_FUNCTION 1
18 RETURN_VALUE
Disassembly of <code object <setcomp> at 0x00000249F64CE030, file "c:\Projects\stack-overflow\asd.py", line 9>:
9 0 BUILD_SET 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 8 (to 14)
6 STORE_FAST 1 (x)
8 LOAD_FAST 1 (x)
10 SET_ADD 2
12 JUMP_ABSOLUTE 4
>> 14 RETURN_VALUE