Влияет ли использование funcName при входе в Python на производительность? - PullRequest
0 голосов
/ 24 ноября 2011

Просто просматривал документацию по регистрации в Python и наткнулся на funcName в качестве параметра в модуле форматирования журнала.

Хотя это выглядит удобным, отличный способ точно определить, откуда поступает журнал, кто-то выразил обеспокоенность по этому поводу, возможно, ему потребуется генерировать трассировку стека, что могло бы повлиять на производительность.

Я предполагаю, что он использует что-то вроде sys._getframe (), а не модуль проверки, что может повлиять на производительность.

Является ли funcName чем-то, что мы могли бы использовать в производственной среде или мы должны держаться подальше?

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

Не поддавайтесь искушению угадать, источник журналирования доступен вам как часть вашего дистрибутива Python.

Как он находит имя функции (logging/__init__.py):

#
# _srcfile is used when walking the stack to check when we've got the first
# caller stack frame.
#
if hasattr(sys, 'frozen'): #support for py2exe
    _srcfile = "logging%s__init__%s" % (os.sep, __file__[-4:])
elif __file__[-4:].lower() in ['.pyc', '.pyo']:
    _srcfile = __file__[:-4] + '.py'
else:
    _srcfile = __file__
_srcfile = os.path.normcase(_srcfile)

# next bit filched from 1.5.2's inspect.py
def currentframe():
    """Return the frame object for the caller's stack frame."""
    try:
        raise Exception
    except:
        return sys.exc_info()[2].tb_frame.f_back

if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)
# done filching

а затем позже:

def findCaller(self):
    """
    Find the stack frame of the caller so that we can note the source
    file name, line number and function name.
    """
    f = currentframe()
    #On some versions of IronPython, currentframe() returns None if
    #IronPython isn't run with -X:Frames.
    if f is not None:
        f = f.f_back
    rv = "(unknown file)", 0, "(unknown function)"
    while hasattr(f, "f_code"):
        co = f.f_code
        filename = os.path.normcase(co.co_filename)
        if filename == _srcfile:
            f = f.f_back
            continue
        rv = (filename, f.f_lineno, co.co_name)
        break
    return rv

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

1 голос
/ 24 ноября 2011

Вот тестовое приложение, которое показывает, что запись имени файла и номера строки в файл стоит около 1 с / 500000 запросов на моем локальном компьютере.

#!/usr/bin/env python

import traceback, sys, time

def writeinfo(f, on=True):

    # give the function something to do
    s=sum(range(1000))

    if on:
        fr = sys._getframe(1)
        s = "%s (line %s) " % (fr.f_code.co_filename, fr.f_lineno)
        f.write(s)

cnt = 50000

t1 = time.time()

f = open('tempfile.log','w')

for i in range(cnt):
    writeinfo(f)

f.close()

t2 = time.time()

for i in range(cnt):
    writeinfo(f, on=False)

t3 = time.time()

print "Test time with    file write: %s" % (t2-t1) 
print "Test time without file write: %s" % (t3-t2) 

Результаты:

Test time with    file write: 1.17307782173
Test time without file write: 1.08166718483
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...