2015-06-12 14 views
3

Что происходит быстрее, a==2==b, или a==2 и b==2?Что происходит быстрее, a == 2 == b или a == 2 и b == 2

Чтобы быть ясным, выражение одно оценивает оба элемента один раз и не сравнивает a с b.

И это стоит прочитать: In Python, is an "and" statement or all() faster?

+4

Пожалуйста, найдите время, чтобы [читать это] (http://ericlippert.com/2012/ 12/17/performance-rant/http: //ericlippert.com/2012/12/17/performance-rant/) – CoryKramer

+0

@CoryKramer Это вопрос с автоответчиком ...? Это тоже своего рода «теоретический» вопрос. –

+1

Я вижу это, я просто публикую этот комментарий. Такие вопросы часто не нужны, потому что они вникают в ненужные микрооптимизации [которые редко являются узким местом в коде] (https://programmers.stackexchange.com/questions/99445/is-micro-optimisation-important-when-coding). Просто напишите свой код для удобочитаемости и правильности, и беспокоитесь об оптимизации ** Если производительность является проблемой ** и **, если эта часть кода ** вызывает проблему. – CoryKramer

ответ

3

Согласно анализу байткод:

>>> dis.dis(compile('a==2==b', '', 'eval')) 
    1   0 LOAD_NAME    0 (a) 
       3 LOAD_CONST    0 (2) 
       6 DUP_TOP 
       7 ROT_THREE 
       8 COMPARE_OP    2 (==) 
      11 JUMP_IF_FALSE_OR_POP 21 
      14 LOAD_NAME    1 (b) 
      17 COMPARE_OP    2 (==) 
      20 RETURN_VALUE 
     >> 21 ROT_TWO 
      22 POP_TOP 
      23 RETURN_VALUE 
>>> dis.dis(compile('a==2 and b==2', '', 'eval')) 
    1   0 LOAD_NAME    0 (a) 
       3 LOAD_CONST    0 (2) 
       6 COMPARE_OP    2 (==) 
       9 JUMP_IF_FALSE_OR_POP 21 
      12 LOAD_NAME    1 (b) 
      15 LOAD_CONST    0 (2) 
      18 COMPARE_OP    2 (==) 
     >> 21 RETURN_VALUE 

Python нужно больше операций обработки a==2==b чем a == 2 and b == 2

5

Timing оба метода с timeit.

Я использую len(), чтобы лучше измерить время выполнения, чтобы задержать немедленную оценку.

строка настройки для обоих:

setup = """import random 
import string 
a = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(2)) 
b = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(2))""" 

Final Test Expression A:

timeit.repeat("len(a)==2==len(b)", setup=setup, repeat=100) 

Final Test Expression B:

timeit.repeat("len(a)==2 and len(b)==2", setup=setup, repeat=100) 

Оба испытания выполняются Выражение один миллион раз , записывает время, затем делает это сто раз.

Выключается, выражение B быстрее примерно на десятую часть секунды. На моем компьютере среднее время выглядит следующим образом:

  • A: 0.22025904178619385 секунд
  • B: 0.3740460252761841 секунд

Попробуйте сами.

Генерация случайных строк благодаря this Stack Overflow question.

+1

Это несколько неудивительно, если вы посмотрите на байт-код с помощью 'dis' - выражение A составляет 12 ops, vs. 8 для выражения B – jonrsharpe

+1

Не могли бы вы расшириться на *« Я использую 'len()' для лучшего определения времени выполнения «* - лучше, чем что? – jonrsharpe

+0

@jonrsharpe Сделано, хотя я не знаю, насколько это понятно. –

 Смежные вопросы

  • Нет связанных вопросов^_^