Почему пустой вызов функции в Python примерно на 15% медленнее для динамически компилируемого кода Python

Это довольно плохая микрооптимизация, но мне просто любопытно. Обычно это не имеет значения в «реальном» мире.

Итак, я компилирую функцию (которая ничего не делает) с помощью compile () , затем вызываю exec для этого кода и получаю ссылку на скомпилированную мной функцию. Затем я выполняю его пару миллионов раз и рассчитываю. Затем повторить это с локальной функцией. Почему динамически скомпилированная функция примерно на 15% медленнее (на python 2.7.2) только для вызова?

import datetime
def getCompiledFunc():
  cc = compile("def aa():pass", '<string>', 'exec')
  dd = {}
  exec cc in dd
  return dd.get('aa')

compiledFunc = getCompiledFunc()  
def localFunc():pass


def testCall(f):
  st = datetime.datetime.now()
  for x in xrange(10000000): f()
  et = datetime.datetime.now()
  return (et-st).total_seconds()

for x in xrange(10):
  lt = testCall(localFunc)
  ct = testCall(compiledFunc)
  print "%s %s %s%% slower" % (lt, ct, int(100.0*(ct-lt)/lt))

Я получаю что-то вроде:

1.139 1.319 15% slower
7
задан Amir 19 November 2011 в 02:22
поделиться