避免python设置时间

时间:2011-06-26 18:21:44

标签: python compiler-construction interpreter profile performance

下图显示python在用户空间中花费了大量时间。是否有可能缩短这个时间?

从某种意义上讲,我将运行一个脚本数次100次。是否可以启动python以便初始化一次需要时间而后续时间不执行?

enter image description here

3 个答案:

答案 0 :(得分:3)

我刚刚搜索了同样的内容并发现了这个:

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秒。

如果您想要非常快,可能必须从分叉切换到仅执行代码而不是分叉。

(这也是我对emacsclient的处理方式......我的emacs需要大约30秒才能启动(由于过度使用我添加的额外库),但emacsclient -c几乎立即显示。)

¹:http://www.socat.org

答案 1 :(得分:1)

在Python脚本中写下“执行这几次100次”逻辑。用其他语言称它为ONCE。

答案 2 :(得分:0)