Это довольно плохая микрооптимизация, но мне просто любопытно. Обычно это не имеет значения в «реальном» мире.
Итак, я компилирую функцию (которая ничего не делает), используя 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