【问题标题】:Profile GUI application bootstrap配置文件 GUI 应用程序引导
【发布时间】:2011-11-11 09:51:46
【问题描述】:

我有一些应用程序的启动时间很慢。

理论上我只想在 gui 启动后立即退出。到目前为止,我都是手工完成的,并且有效,但我想知道是否有更好的方法......

一个解决方案当然是在我想要退出的地方添加一个“sys.exit”,但我应该修改代码。

有没有办法在不修改文件的情况下检测文件以在某些情况下退出?

【问题讨论】:

  • 您是否想说您的应用程序需要很长时间才能启动,并且您想找出原因,以便修复它以使其启动更快?如果是这样,您可能想try this.
  • 您确定这是正确的链接吗?无论如何,是的,该应用程序需要很长时间,我确实知道如何分析它,但我不知道如何只分析引导程序。我基本上需要在 GUI 启动后立即退出,而不需要手动操作...
  • 您不能在应用程序启动时按 Ctrl-C 吗?然后python将停止,并显示堆栈。这会告诉你当时它在做什么。由于花费的时间如此之长,因此您不会抓住它做浪费的机会的机会非常小。可以肯定的是,做几次。这与剖析不同。你可能认为是,但事实并非如此。它比分析器更快地带您直接解决问题。
  • 嗯不,这不是我想要的……我想准确测量第一阶段花费的时间,也想看看我所做的更改是否真的有用。
  • 好吧,某种计时器可以做到这一点。随机暂停的作用是告诉您应该修复什么,例如 this example 的加速因子为 43。重新修复正确的事情,你可以做到。

标签: python profiling


【解决方案1】:

好吧,在我想要的地方实际设置一个“退出点”而不触及代码并不是那么简单。

不过,我认为可以使用 sys.settrace 来完成,如下所示 http://www.doughellmann.com/PyMOTW/sys/tracing.html

所以我的解决方案是实际修改代码,只需在某个点添加退出行。

我想使用 difflib,但它没有修补功能,所以我创建了下面的小脚本,简而言之: - 读取文件 - 插入/删除一行(插入时与前一行具有相同的缩进) - 重写它

#TODO: must make sure about the indentation
import argparse
import re
import sys

PATCH_LINE = "import sys; sys.exit(0)  # PATCHED"


def parse_arguments():
    # take the file and the line to patch, or maybe we can take a
    # diff file generated via uniform_diff
    parser = argparse.ArgumentParser(description='enable and disable the automatic exit')
    parser.add_argument('file', help='file to patch')

    parser.add_argument('line', help='line where to quit')

    parser.add_argument('-m', '--msg',
                        default=PATCH_LINE)

    parser.add_argument('-d', '--disable',
                        action='store_true')

    return parser.parse_args()


if __name__ == '__main__':
    ns = parse_arguments()
    text = open(ns.file).readlines()
    line_no = int(ns.line)

    if ns.disable:
        # the line should not be necessary in that case?
        text.remove(text[line_no])
    else:
        # count spaces
        prev = text[line_no - 1]
        m = re.match('\s*', prev)
        to_insert = m.group() + ns.msg
        print("inserting line %s" % to_insert)
        text.insert(line_no, to_insert)

    open(ns.file, 'w').writelines(text)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 2019-04-22
    • 2016-03-25
    • 2013-04-15
    • 2013-12-11
    • 2013-08-18
    • 2014-10-14
    • 2021-01-13
    相关资源
    最近更新 更多