Действительно ли это верно, что код 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.

  • Как реализовано set ()?
  • CPython против Jython против IronPython для кросс-платформенного графического интерфейса
  • Каковы некоторые стратегии для написания кода Python, который работает в CPython, Jython и IronPython
  • Как сопоставить записи func_closure с именами переменных?
  • Как создать повторяемую последовательность случайных чисел?
  • Упорядоченные слова
  • Что такое пакет python-dev, используемый для
  • Почему «new_file + = строка + строка» намного быстрее, чем «new_file = new_file + line + string»?
  • Python - лучший язык программирования в мире.