Инициализация набора понимания - PullRequest
2 голосов
/ 28 февраля 2020

Вот пример понимания набора:

inp    = [1,2,3,4,4,3,5]
s_comp = {element for element in inp}
# {1, 2, 3, 4, 5}

Знает ли python преобразование нижеприведенного в непосредственное понимание набора (пропуская начальный список?), Или это сначала делает список понимание и затем преобразование полученного списка в набор (другими словами, это просто пустая трата ресурсов, использующих эту нотацию для создания набора).

s_comp = set([element for element in inp])
# {1, 2, 3, 4, 5}

Обратите внимание, из cProfile кажется, что сначала делает понимание списка для последнего. Хотя каждый из них имеет одинаковое количество шагов (я бы предположил, что первый должен иметь на один шаг меньше?).

>>> cProfile.run('{element for element in [1,2,3,4,4,3,5]}')
         4 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 <string>:1(<setcomp>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}

>>> cProfile.run('set([element for element in [1,2,3,4,4,3,5]])')
         4 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<listcomp>) # list not set
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}


1 Ответ

2 голосов
/ 28 февраля 2020

Если у вас есть итерация, то это пустая трата ресурсов, использующая понимание списка [] вместо непосредственного понимания набора {}.

Если вы посмотрите на байт-код fun c A ниже вы увидите, что Python создает список и передает его в качестве параметра функции set ().

В байт-коде Fun * c B Python оптимизирован для непосредственного построения набора.

Я использовал следующий код для анализа.

from dis import dis

def a():
    return set([x for x in range(1, 10)])

def b():
    return {x for x in range(1, 10)}

print('Dis Func A\n')
print(dis(a))
print('Dis Func B\n')
print(dis(b))

Dis Fun c A

  5           0 LOAD_GLOBAL              0 (set)
              2 LOAD_CONST               1 (<code object <listcomp> at 0x00000249F64B2EA0, file "c:\Projects\stack-overflow\asd.py", line 5>)
              4 LOAD_CONST               2 ('a.<locals>.<listcomp>')
              6 MAKE_FUNCTION            0
              8 LOAD_GLOBAL              1 (range)
             10 LOAD_CONST               3 (1)
             12 LOAD_CONST               4 (10)
             14 CALL_FUNCTION            2
             16 GET_ITER
             18 CALL_FUNCTION            1
             20 CALL_FUNCTION            1
             22 RETURN_VALUE

Disassembly of <code object <listcomp> at 0x00000249F64B2EA0, file "c:\Projects\stack-overflow\asd.py", line 5>:
  5           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                 8 (to 14)
              6 STORE_FAST               1 (x)
              8 LOAD_FAST                1 (x)
             10 LIST_APPEND              2
             12 JUMP_ABSOLUTE            4
        >>   14 RETURN_VALUE

Dis Fun c B

  9           0 LOAD_CONST               1 (<code object <setcomp> at 0x00000249F64CE030, file "c:\Projects\stack-overflow\asd.py", line 9>)
              2 LOAD_CONST               2 ('b.<locals>.<setcomp>')
              4 MAKE_FUNCTION            0
              6 LOAD_GLOBAL              0 (range)
              8 LOAD_CONST               3 (1)
             10 LOAD_CONST               4 (10)
             12 CALL_FUNCTION            2
             14 GET_ITER
             16 CALL_FUNCTION            1
             18 RETURN_VALUE

Disassembly of <code object <setcomp> at 0x00000249F64CE030, file "c:\Projects\stack-overflow\asd.py", line 9>:
  9           0 BUILD_SET                0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                 8 (to 14)
              6 STORE_FAST               1 (x)
              8 LOAD_FAST                1 (x)
             10 SET_ADD                  2
             12 JUMP_ABSOLUTE            4
        >>   14 RETURN_VALUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...