0

Как создать "пустое условие if" в Python

9

Тема: Работает ли "пустое условие if" в Python и влияет ли это на производительность приложения?

В C довольно распространено использование такого "пустого" условия if, например:

if(mostlyhappencondition)
    ; // пустое выражение
else {
    dosomething();
}

Меня интересует, возможно ли использовать нечто подобное в Python? Сможем ли мы улучшить производительность приложения с помощью этого подхода, и почему?

4 ответ(ов)

0

В вашем вопросе рассматривается, как отсутствие ветки else в условии if может улучшить производительность, поскольку байт-коды не переходят к исполнению в случае if.

Давайте посмотрим на пример функций и вывод команды dis.dis(foo).

Вот пример приложения:

def foo(x):
    if x:
        pass
    else:
        return x + 2

После дизассемблирования это выглядит так:

5           0 LOAD_FAST                0 (x)
            3 POP_JUMP_IF_FALSE        9

6           6 JUMP_FORWARD             8 (to 17)

8     >>    9 LOAD_FAST                0 (x)
           12 LOAD_CONST               1 (2)
           15 BINARY_ADD
           16 RETURN_VALUE
      >>   17 LOAD_CONST               0 (None)
           20 RETURN_VALUE

Как видно, во втором случае код переходит к ветке else, которая обрабатывает возврат x + 2 только если if не выполнено. Но после выполнения if, интерпретатор всё равно выполняет LOAD_CONST и RETURN_VALUE, даже если if сработал и вернулся None.

Теперь рассмотрим следующую версию функции:

def foo(x):
    if not x:
        return x + 2

Дизассемблирование этого варианта показывает следующее:

11           0 LOAD_FAST                0 (x)
             3 POP_JUMP_IF_TRUE        14

12           6 LOAD_FAST                0 (x)
             9 LOAD_CONST               1 (2)
            12 BINARY_ADD
            13 RETURN_VALUE
       >>   14 LOAD_CONST               0 (None)

Здесь интерпретатор выполняет POP_JUMP_IF_TRUE, что позволяет избежать ненужного выполнения кода, если x истинно. Это может привести к небольшому улучшению производительности, поскольку байт-код не выполняет лишние операции.

В заключение, действительно, наличие или отсутствие ветки else в конструкции if может повлиять на производительность, благодаря различиям в сгенерированном байт-коде.

0

Вы, похоже, ищете оператор pass, который иногда необходим для создания пустого блока кода, чтобы избежать ошибки синтаксиса.

if mostlyhappencondition:
    pass
else:
    do_something()

Однако более привычным будет просто сделать так, что логически абсолютно эквивалентно:

if not mostlyhappencondition:
    do_something()

Здесь нет никаких значительных преимуществ по производительности.

0

Если у вас нет недостатка в условии if True:, вы можете использовать следующий подход:

if not mostlyhappenedcondition:
    do something()

Если вам в будущем не нужно будет добавлять что-либо в блок if, то использование такого условия стало бы избыточным в вашем коде.

В общем, старайтесь избегать лишних условий, поскольку это может усложнить чтение и понимание вашего кода.

0

Нет, это не улучшит производительность. На самом деле, в C тоже не дает прироста. Откуда вы это узнали?

Операторы not/! удобнее для чтения и должны работать с примерно одинаковой скоростью.


На самом деле, я протестировал это с помощью gcc -O4:

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i = 0; i < 1000000000; i++) {
        if(!(i < 900000000)) {
            putchar('.');
        }
    }
}

и

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i = 0; i < 1000000000; i++) {
        if(i < 900000000);
        else {
            putchar('.');
        }
    }
}

Программа #1 заняла 6.62 секунды, а программа #2 — 6.64 секунды на моем компьютере.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь