Лучший способ представить/оптимизировать веб-сайт на Google App Engine

Я в настоящее время пытаюсь оптимизировать свой веб-сайт, который выполняется на Google App Engine. Это не легкая задача, потому что я не использую мощного инструмента.

У кого-либо есть опыт в оптимизации кода Python с этой целью? Вы сделали, находят хорошего профилировщика Python?

15
задан Denis T. 8 October 2019 в 11:38
поделиться

2 ответа

Я нашел Gprof2Dot чрезвычайно полезный. Вывод профильных модулей я попытался как довольно необладающий интуицией интерпретировать.

Gprof2Dot превращает вывод cProfile в симпатично выглядящий график с самой медленной цепочкой (?), выделенной, и немного информации о каждой функции (имя функции, процент времени тратят на эту функцию и количество вызовов).

График в качестве примера (1429x1896 пкс)

Я не сделал многого с Механизмом Приложения, но при профилировании сценариев невеб-приложения, я склонен представлять сценарий, который выполняет весь unittests, который не может быть очень с точностью до реальных ситуаций

Один (лучше?) метод должен был бы иметь сценарий, который делает поддельный запрос WSGI, затем представляет это.

WSGI является действительно простым протоколом, это - в основном функция, которая берет два аргумента, один с информацией о запросе и вторым с функцией обратного вызова (который используется для установки заголовков, среди прочего). Возможно, что-то как следующее (который является возможно рабочим псевдо кодом)...

class IndexHandler(webapp.RequestHandler):
    """Your site"""
    def get(self):
        self.response.out.write("hi")

if __name__ == '__main__':
    application = webapp.WSGIApplication([
        ('.*', IndexHandler),
    ], debug=True)

    # Start fake-request/profiling bit
    urls = [
        "/",
        "/blog/view/hello",
        "/admin/post/edit/hello",
        "/makeanerror404",
        "/makeanerror500"
    ]

    def fake_wsgi_callback(response, headers):
        """Prints heads to stdout"""
        print("\n".join(["%s: %s" % (n, v) for n, v in headers]))
        print("\n")

    for request_url in urls:
        html = application({
        'REQUEST_METHOD': 'GET',
        'PATH_INFO': request_url},
        fake_wsgi_callback
        )
        print html

На самом деле документация Механизма Приложения объясняет лучший способ представить Ваше приложение:

Из http://code.google.com/appengine/kb/commontasks.html#profiling:

Для профилирования производительности приложения сначала переименуйте приложение main() функция к real_main(). Затем добавьте новую основную функцию к своему приложению, названному profile_main() такой как тот ниже:

def profile_main():
    # This is the main function for profiling 
    # We've renamed our original main() above to real_main()
    import cProfile, pstats
    prof = cProfile.Profile()
    prof = prof.runctx("real_main()", globals(), locals())
    print "<pre>"
    stats = pstats.Stats(prof)
    stats.sort_stats("time")  # Or cumulative
    stats.print_stats(80)  # 80 = how many to print
    # The rest is optional.
    # stats.print_callees()
    # stats.print_callers()
    print "</pre>"

[...]

Для включения профилирования с приложением установить main = profile_main. Для запуска приложения как нормального просто установите main = real_main.

13
ответ дан 1 December 2019 в 02:55
поделиться

Сайт Python перечислил 3 профилировщиков для выбора из: http://docs.python.org/library/profile.html

1
ответ дан 1 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: