Вы можете сделать это с помощью функции трассировки (реквизиты для Spacedman для улучшения исходной версии этого для отслеживания возвратов и использования некоторого приятного отступа):
def tracefunc(frame, event, arg, indent=[0]):
if event == "call":
indent[0] += 2
print "-" * indent[0] + "> call function", frame.f_code.co_name
elif event == "return":
print "<" + "-" * indent[0], "exit function", frame.f_code.co_name
indent[0] -= 2
return tracefunc
import sys
sys.settrace(tracefunc)
main() # or whatever kicks off your script
Обратите внимание, что объект кода функции обычно имеет то же имя, что и связанная функция, но не всегда, так как функции могут создаваться динамически. К сожалению, Python не отслеживает объекты функции в стеке (я иногда фантазировал о том, чтобы указать для этого патч). Тем не менее, это в большинстве случаев «достаточно хорошо».
Если это становится проблемой, вы можете извлечь «реальное» имя функции из исходного кода: Python отслеживает имя файла и номер строки - или попросите сборщика мусора выяснить, какой объект функции ссылается на объект кода. Может быть более одной функции, разделяющей объект кода, но любое из их имен может быть достаточно хорошим.
Возвращаясь к этому четыре года спустя, мне следует сказать, что в Python 2.6 и позже вы можете получить более высокую производительность, используя sys.setprofile()
, а не sys.settrace()
. Можно использовать ту же самую функцию трассировки; это просто, что функция профиля вызывается только при вводе или выходе функции, поэтому функция внутри функции выполняется на полной скорости.
Google Closure Compiler не зависит от jQuery или любой другой библиотеки. Он имеет два типа оптимизаций -
Я пробовал применять расширенные оптимизации, но это сильно сломало мое приложение. Если он делает то же самое, вы можете либо попытаться исправить свое приложение, либо использовать простую оптимизацию. С простой оптимизацией размер уменьшился на 32%, а с продвинутой - примерно на 68%, но это все равно не помогло.
Перемещение конкатенации JS автоматизированным способом в ваш процесс сборки - это определенно путь к успеху. См. Управление зависимостями JavaScript.
jQuery уже сильно оптимизирован под размер байта, так что я сомневаюсь, что вы сможете выжать достаточно сока, используя Google Closure Compiler, но попробовать стоит, если вы используете его в своем проекте.
Я рассматриваю Google Closure Library в благоприятном свете, но еще не начал ее использовать, так как на данный момент я сильно вложился в MooTools. Если посмотреть на ее API, кажется, что она имеет довольно широкий охват того, что она может предложить, помимо манипуляций с DOM, обработки AJAX, обработки событий и т.д.
Я считаю, что начиная с версии 1.4.2 (возможно, раньше) jQuery по умолчанию минимизирован с использованием компилятора Google Closure. Так что, вероятно, лучше продолжать ссылаться на jQuery / jQuery UI через google CDN. Тем не менее, интеграция компилятора Closure в процесс сборки по-прежнему дает преимущества для объединения и минимизации файлов JS. А именно, уменьшение количества JS-запросов на загрузку страницы и меньший объем передаваемых данных в надежде улучшить производительность загрузки страницы на стороне клиента. Вот некоторые из проблем, с которыми мы столкнулись при интеграции компилятора Closure в наш процесс сборки:
Создание команды компиляции - Нам требовалось средство автоматического вызова компилятора со всеми необходимыми параметрами в процессе сборки.Для нас это означало написание консольного приложения для создания команды. Если в вашей среде доступны сценарии оболочки, это может быть преимуществом.
Управление зависимостями - Компилятор Closure имеет возможность автоматически сортировать порядок объединенного JS таким образом, чтобы зависимости сохранялись. Чтобы использовать эту функцию, файлы JS должны быть аннотированы goog.provide \ goog.require
, чтобы сообщить компилятору, каковы зависимости ( - manage_closure_dependencies ). Компилятор также исключит любой JS, который не требуется (т. Е. Не упоминается с помощью оператора goog.require
) из объединенного JS. Вот несколько вещей, на которые следует обратить внимание:
goog.require
операторов для каждого включаемого файла в комбинированном сценарии (т.е. нет операторов goog.provide
). SIMPLE_OPTIMIZATIONS
или выше. В противном случае компилятор не удалит операторы goog.provide / goog.require
. В качестве альтернативы вы также можете определить свои собственные goog.provide / goog.require
JS-функции, чтобы избежать ошибок. Компиляция отладочной версии объединенного сценария - При необходимости вы можете скомпилировать отладочную версию объединенного сценария, используя - флаг PRETTY_PRINT
форматирования. Это выведет эквивалентный сценарий, отформатированный с неповрежденными пробелами, для разработки / отладки.
Хотя документация по компилятору Closure временами может быть скудной, ее по большей части достаточно, чтобы начать работу, и она постоянно улучшается - так что проверяйте обновления регулярно, а не только SO;)
Надеюсь, это поможет.