Рубрики
Без рубрики

Список кортеж: небольшая оптимизация компиляции

Я читал Советы Python Julien Maury’s Python и столкнулись с этим кодом-фрагментом: если Myvar в [9,1,7] … Теги с Python.

Я читал Советы 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”