Я читал Советы Python Julien Maury Python и столкнулись с этим фрагментом кода:
if myvar in [9,1,7]
Я собирался оставить комментарий, чтобы предложить с помощью кортеже, потому что инстинктивно вы бы подумать, что кортежи должны быть быстрее, чем списки, верно?
if myvar in (9,1,7)
И тогда я решил не доверять моим инстинсе и сначала взглянуть на байткоде. Ну, что вы знаете … оба кода компилируется точно так же:
0 LOAD_FAST 0 (myvar) 2 LOAD_CONST 1 ((9, 1, 7)) 4 COMPARE_OP 6 (in)
Таким образом, компилятор достаточно умно, чтобы понять, что даже если я создаю сметный список, я на самом деле не буду внести никаких изменений в него, и будет использовать его только один раз, поэтому он преобразует список в кортелю.
Принимая еще один шаг, я изменил код:
l = [9, 1, 7] if myvar in l
Теперь компилятор создает список:
0 LOAD_CONST 1 (9) 2 LOAD_CONST 2 (1) 4 LOAD_CONST 3 (7) 6 BUILD_LIST 3 8 STORE_FAST 1 (l) 10 LOAD_FAST 0 (myvar) 12 LOAD_FAST 1 (l) 14 COMPARE_OP 6 (in)
Хотя я полагаю, что можно утверждать, что в этом случае компилятор все еще должен обнаружить, что л
никогда не меняется и преобразовал его в кортеж.
Оригинал: “https://dev.to/jingxue/list-to-tuple-a-little-compilation-optimization-1gn0”