Python: множественное присвоение и индивидуальная скорость присваивания

Я искал, чтобы выжать немного больше производительности из моего кода; недавно, просматривая эту страницу вики Python , я нашел это утверждение:

Множественное назначение выполняется медленнее, чем отдельное задание. Например, «x, y = a, b» медленнее, чем «x = a; y = b».

Любопытно, я протестировал его (на Python 2.7):

$ python -m timeit "x, y = 1.2, -1.4" 10000000 loops, best of 3: 0.0365 usec per loop $ python -m timeit "x = 1.2" "y = -1.4" 10000000 loops, best of 3: 0.0542 usec per loop 

Я повторял несколько раз, в разных порядках и т. Д., Но множественный фрагмент задания последовательно выполнялся как минимум на 30% лучше, чем отдельное задание. Очевидно, что часть моего кода, связанная с назначением переменных, не станет источником каких-либо значительных узких мест, но мое любопытство все же вызвано. Почему множественное назначение, по-видимому, быстрее, чем отдельное задание, если в документации указано иное?

РЕДАКТИРОВАТЬ:

Я проверил назначение более чем на две переменные и получил следующие результаты:

Тенденция кажется более или менее последовательной; может ли кто-нибудь воспроизвести его?

(CPU: Intel Core i7 @ 2.20GHz)

Интересно, что в некоторой степени это может зависеть от процессора. Это обе 64-разрядные Linux-машины (такая же Python-сборка).

Результат для Intel (R) Core (TM) 2 Duo CPU T7300 @ 2,00 ГГц

 $ python -V Python 2.7.5+ $ python -m timeit "x, y = 1.2, -1.4" 10000000 loops, best of 3: 0.0554 usec per loop $ python -m timeit "x = 1.2" "y = -1.4" 10000000 loops, best of 3: 0.0349 usec per loop 

Результат для Intel (R) Pentium (R) CPU G850 @ 2,90 ГГц

 $ python -V Python 2.7.5+ $ python -m timeit "x, y = 1.2, -1.4" 10000000 loops, best of 3: 0.0245 usec per loop $ python -m timeit "x = 1.2" "y = -1.4" 10000000 loops, best of 3: 0.0394 usec per loop 

Лучше посмотрите на модуль python. Который разбирает байт-код. Тест показывает два значения переменной:

 import dis def single_assignment(): x = 1 y = 2 def multiple_assignment(): x, y = 1, 2 print dis.dis(single_assignment) print dis.dis(multiple_assignment) 

Bytecode:

  4 0 LOAD_CONST 1 (1) 3 STORE_FAST 0 (x) 5 6 LOAD_CONST 2 (2) 9 STORE_FAST 1 (y) 12 LOAD_CONST 0 (None) 15 RETURN_VALUE None 8 0 LOAD_CONST 3 ((1, 2)) 3 UNPACK_SEQUENCE 2 6 STORE_FAST 0 (x) 9 STORE_FAST 1 (y) 12 LOAD_CONST 0 (None) 15 RETURN_VALUE None 

Похоже, что количество байткодов, необходимых для двух переменных, одинаково. Если задано 3 или более переменных, количество байткодов меньше.

Interesting Posts