下图显示python在用户空间中花费了大量时间。是否有可能缩短这个时间?
从某种意义上讲,我将运行一个脚本数次100次。是否可以启动python以便初始化一次需要时间而后续时间不执行?
答案 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几乎立即显示。)
答案 1 :(得分:1)
在Python脚本中写下“执行这几次100次”逻辑。用其他语言称它为ONCE。
答案 2 :(得分:0)
改为使用timeit: