避免Python设置时间
下面这张图片说的是,Python在用户空间运行时需要花费很多时间。有没有办法减少这个时间呢?
我的意思是,我会运行一个脚本好几百次。有没有办法让Python只在第一次启动时花时间初始化,以后就不用再初始化了呢?
3 个回答
0
使用timeit模块来进行计时:
1
在你的Python脚本里写一个“做这个几百次”的逻辑。然后从其他语言里调用它一次就可以了。
3
我刚刚搜索了同样的问题,发现了这个:
http://blogs.gnome.org/johan/2007/01/18/introducing-python-launcher/
Python-launcher并没有直接解决问题,但它给了我们一个有趣的思路:如果你创建一个小的守护进程,可以通过命令行联系它来启动一个新的实例,这样你可能就能减少启动时间。
比如,你可以获取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
待办事项:根据你的程序进行调整,去掉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几乎是瞬间就能显示出来。)