Действительно ли это верно, что код Python работает быстрее в функции?

Я видел комментарий, который подводит меня к вопросу. Почему код Python работает быстрее в функции? ,

Я подумал, и решил, что я попробую сам использовать библиотеку timeit , однако у меня были разные результаты:

( примечание : 10**8 было изменено на 10**7 чтобы сделать вещи немного быстрее к времени)

 >>> from timeit import repeat >>> setup = """ def main(): for i in xrange(10**7): pass """ >>> stmt = """ for i in xrange(10**7): pass """ >>> min(repeat('main()', setup, repeat=7, number=10)) 1.4399558753975725 >>> min(repeat(stmt, repeat=7, number=10)) 1.4410973942722194 >>> 1.4410973942722194 / 1.4399558753975725 1.000792745732109 
  • Правильно ли я использовал timeit ?
  • Почему эти результаты менее 0,1% отличаются друг от друга, в то время как результаты по другому вопросу были почти на 250% различны?
  • Значит ли это только при использовании CPython скомпилированных версий Python (например, Cython)?
  • В конечном счете: действительно ли код Python работает быстрее в функции или зависит только от того, как вы его используете?

2 Solutions collect form web for “Действительно ли это верно, что код Python работает быстрее в функции?”

Недостатком вашего теста является то, как timeit код вашего stmt . Он фактически скомпилирован в следующем шаблоне:

 template = """ def inner(_it, _timer): %(setup)s _t0 = _timer() for _i in _it: %(stmt)s _t1 = _timer() return _t1 - _t0 """ 

Таким образом, stmt фактически работает в функции, используя массив fastlocals (то есть STORE_FAST ).

Вот тест с вашей функцией в вопросе как f_opt сравнению с unoptimized скомпилированным stmt выполненным в функции f_no_opt :

 >>> code = compile(stmt, '<string>', 'exec') >>> f_no_opt = types.FunctionType(code, globals()) >>> t_no_opt = min(timeit.repeat(f_no_opt, repeat=10, number=10)) >>> t_opt = min(timeit.repeat(f_opt, repeat=10, number=10)) >>> t_opt / t_no_opt 0.4931101445632647 

Это сводится к алгоритмам оптимизации компилятора. При выполнении компиляции «точно вовремя» гораздо проще идентифицировать часто используемые фрагменты кода, если они находятся в функциях.

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

Однако, как отмечали другие, CPython не выполняет компиляцию точно в срок. Однако при компиляции кода компиляторы C будут часто выполнять их быстрее.

Ознакомьтесь с этим документом в компиляторе GCC: http://gcc.gnu.org/onlinedocs/gcc/Inline.html.

  • Почему эти две функции различны?
  • Использует ли cPython несколько ядер для встроенных функций, таких как sort, any, all?
  • Почему наивная конкатенация строк становится квадратичной над определенной длиной?
  • Модуль Python C - Malloc не работает в конкретной версии Python
  • Почему команды курсора вверх и вниз не работают в интерпретаторе командной строки Python?
  • Вектор C ++ для Python 3.3
  • Как загрузить C # dll в python?
  • Почему мое сито Eratosthenes работает быстрее с целыми числами, чем с булевыми?
  • Какой метод использует Python 2 для печати кортежей?
  • Аргумент Распаковка отходов
  • Как создать повторяемую последовательность случайных чисел?
  •  
    Interesting Posts for Van-Lav

    Запускайте нескольких пауков-пауков одновременно с помощью scrapyd

    ищет быстрый способ вычисления парных расстояний многих строк

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

    Разве грех использовать бесконечную рекурсию для бесконечных циклов в Python?

    Regex соответствует каждому символу хотя бы один раз

    ОТКРЫТЬ ИЗОБРАЖЕНИЕ ИСПОЛЬЗОВАНИЕ PYTHON, показывая ошибку

    Как копировать аудио с видео?

    Время и время Python до microtime

    Как назначить и использовать заголовки столбцов в Spark?

    Python: __init __ () принимает 2 позиционных аргумента, но 3 даны

    Не удалось загрузить репозиторий (PyDev для eclipse)

    Возвращаемые значения из нескольких столбцов CSV в словарь Python?

    Графики Matplotlib не отображаются при запуске файла из терминала bash

    Как указать положительный класс в произвольном лесу H2O или другом двоичном классификаторе?

    выделение большего размера в sizer до wx.CollapsiblePane при расширении

    Python - лучший язык программирования в мире.