【问题标题】:Avoid python setup time避免python设置时间
【发布时间】:2011-09-23 01:43:53
【问题描述】:

下图显示 python 在用户空间中占用了大量时间。有没有可能减少这个时间?

从某种意义上说,我将运行一个脚本数 100 次。是否可以启动python,以便初始化一次需要时间并且以后不这样做??

【问题讨论】:

  • 不要相信time 进行如此小粒度的测量。
  • 其实这是实际问题的小版本。实际问题在系统空间需要 0.003 秒,但在用户空间需要大量时间。如stackoverflow.com/questions/6485538/… 所示
  • @Tim Cooper - 感谢您的编辑。
  • 我想从一个 perl 代码运行一个 python 脚本 100 次。这样的 Python 脚本运行速度很快。但是在用户空间设置等方面需要很多时间,所以,我想减少这个时间。
  • 你不能。 Python 需要很长时间来设置其环境。你将不得不忍受它。如果这确实是一个问题,那么使用 perl 程序通过套接字将数据传递给 python 程序的客户端-服务器类型程序可能是一种选择。但是,几百次并不是很多次。我怀疑您最好只运行程序而不是编写更复杂的解决方案。

标签: python compiler-construction interpreter profile performance


【解决方案1】:

我刚刚搜索过,发现了这个:

http://blogs.gnome.org/johan/2007/01/18/introducing-python-launcher/

Python-launcher 并没有直接解决问题,但它指向了一个有趣的方向:如果你创建一个小守护进程,你可以通过 shell 联系它来创建一个新实例,你也许可以摆脱你的启动时间。

例如获取 python-launcher 和 socat¹ 并执行以下操作:

PYTHONPATH="../lib.linux-x86_64-2.7/" python python-launcher-daemon &
echo pass > 1
for i in {1..100}; do 
    echo 1 | socat STDIN UNIX-CONNECT:/tmp/python-launcher-daemon.socket & 
done

Todo:根据您的程序调整它,删除 GTK 内容。注意末尾的 &:关闭套接字连接似乎很慢。

基本技巧是只创建一个打开套接字的服务器。然后它从套接字读取所有数据。一旦有了数据,它就会像下面这样分叉:

        pid = os.fork()
        if pid:
            return

        signal.signal(signal.SIGPIPE, signal.SIG_DFL)
        signal.signal(signal.SIGCHLD, signal.SIG_DFL)

        glob = dict(__name__="__main__")
        print 'launching', program
        execfile(program, glob, glob)

        raise SystemExit

以这种方式运行 100 个程序对我来说只用了 0.7 秒。

如果你想真正快的话,你可能不得不从 fork 切换到只执行代码而不是 fork。

(这也是我对 emacsclient 所做的……我的 emacs 需要大约 30 秒才能启动(由于过度使用我添加的其他库),但 emacsclient -c 几乎立即出现。)

¹:http://www.socat.org

【讨论】:

  • 或者,您可以检查是否可以在没有站点文件的情况下使用 python:python -S [script]。没有 -S python -c '' 对我来说需要 0.018 秒。使用-S 我下降到time python -S -c '' → 0.004s。请注意,这样您可能会错过一些已安装的软件包。
  • 我现在也在我的网站上发布了这个答案:draketo.de/light/english/politics-and-free-software/…
【解决方案2】:

在您的 Python 脚本中编写“执行 100 次”逻辑。用另一种语言调用一次。

【讨论】:

  • perl 代码在某个时间点具有特定的上下文,并调用 python 代码来获取该上下文的数据。因此,这将需要大量的精力来重写代码。因此寻找简单的东西。
【解决方案3】:

【讨论】:

  • timeit 在这种情况下不会有帮助。他不是在对程序进行基准测试,他想知道是否可以针对 Python 的缓慢启动时间做点什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
相关资源
最近更新 更多