Почему цикличное выполнение по диапазону () в Python быстрее, чем использование некоторое время цикла?

jsonEncode в качестве псевдонима для json был введен, потому что json часто сталкивался с именем переменной json, часто используемой для переменной, содержащей значение JSON.

var json = http.get(...);
var data = json.decode(json); // error
var data = jsonDecode(json); // ok
73
задан A. Dorton 15 May 2009 в 15:06
поделиться

4 ответа

см. Разборку байтового кода python, вы можете получить более конкретную идею

использование цикла while:

1           0 LOAD_CONST               0 (0)
            3 STORE_NAME               0 (i)

2           6 SETUP_LOOP              28 (to 37)
      >>    9 LOAD_NAME                0 (i)              # <-
           12 LOAD_CONST               1 (100000000)      # <-
           15 COMPARE_OP               0 (<)              # <-
           18 JUMP_IF_FALSE           14 (to 35)          # <-
           21 POP_TOP                                     # <-

3          22 LOAD_NAME                0 (i)              # <-
           25 LOAD_CONST               2 (1)              # <-
           28 INPLACE_ADD                                 # <-
           29 STORE_NAME               0 (i)              # <-
           32 JUMP_ABSOLUTE            9                  # <-
      >>   35 POP_TOP
           36 POP_BLOCK

Тело цикла имеет 10 операций

диапазон использования:

1           0 SETUP_LOOP              23 (to 26)
            3 LOAD_NAME                0 (range)
            6 LOAD_CONST               0 (0)
            9 LOAD_CONST               1 (100000000)
           12 CALL_FUNCTION            2
           15 GET_ITER
      >>   16 FOR_ITER                 6 (to 25)        # <-
           19 STORE_NAME               1 (n)            # <-

2          22 JUMP_ABSOLUTE           16                # <-
      >>   25 POP_BLOCK
      >>   26 LOAD_CONST               2 (None)
           29 RETURN_VALUE

В теле цикла 3 операции

Время выполнения кода C намного короче, чем у интерпретатора, и его можно игнорировать.

144
ответ дан 24 November 2019 в 12:10
поделиться

Потому что вы чаще выполняете код написано на C в интерпретаторе. т.е. i + = 1 находится в Python, поэтому он медленный (сравнительно), тогда как range (0, ...) - это один вызов C, цикл for будет выполняться в основном и в C.

3
ответ дан 24 November 2019 в 12:10
поделиться

Большинство вызовов встроенных методов Python выполняются как код C. Код, который нужно интерпретировать, работает намного медленнее. С точки зрения эффективности памяти и скорости выполнения разница огромна. Внутреннее устройство Python было оптимизировано до крайности, и лучше всего воспользоваться этими оптимизациями.

1
ответ дан 24 November 2019 в 12:10
поделиться

range () реализован в C, тогда как i + = 1 интерпретируется.

Использование xrange () может сделать это еще быстрее для больших чисел. Начиная с Python 3.0 range () такой же, как и ранее xrange () .

32
ответ дан 24 November 2019 в 12:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: