Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免python安装时间_Python_Compiler Construction_Interpreter_Profile_Performance - Fatal编程技术网

避免python安装时间

避免python安装时间,python,compiler-construction,interpreter,profile,performance,Python,Compiler Construction,Interpreter,Profile,Performance,下图显示python在用户空间中占用了大量时间。是否有可能缩短这段时间 从某种意义上说,我将运行一个脚本数百次。是否可以启动python,以便只需要一次初始化就可以了,而不需要在以后的时间内初始化 改用timeit: 在Python脚本中编写“多次执行此操作”逻辑。从另一种语言中调用它一次。我刚刚搜索了相同的语言,发现: PythonLauncher并没有直接解决这个问题,但它指出了一个有趣的方向:如果您创建一个小的守护进程,您可以通过shell与之联系以派生一个新实例,那么您可能就可以摆脱启

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

从某种意义上说,我将运行一个脚本数百次。是否可以启动python,以便只需要一次初始化就可以了,而不需要在以后的时间内初始化

改用timeit:


在Python脚本中编写“多次执行此操作”逻辑。从另一种语言中调用它一次。

我刚刚搜索了相同的语言,发现:

PythonLauncher并没有直接解决这个问题,但它指出了一个有趣的方向:如果您创建一个小的守护进程,您可以通过shell与之联系以派生一个新实例,那么您可能就可以摆脱启动时间

例如,获取python启动器和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
        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
Todo:根据您的程序进行调整,删除GTK内容。注意&结尾:关闭套接字连接似乎很慢

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

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

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

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


➣:

不要相信时间的测量粒度如此之小。实际上,这是实际问题的较小版本。实际问题在系统空间中需要0.003秒,但在用户空间中需要大量时间。如@Tim Cooper所示-感谢您的编辑。我想从perl代码中运行python脚本100次。Python scirpt本身运行速度很快。但是在用户空间设置等方面需要花费很多时间,所以,我想减少这个时间。你不能。Python需要很长时间来设置其环境。你只能忍受它。如果这真的是一个问题,那么一个带有perl程序的客户机-服务器类型的程序可以通过套接字将数据传递给python程序。然而,几百次并不是很多次。我怀疑您最好只是运行程序,而不是编写更复杂的解决方案。perl代码在某个时间点具有特定的上下文,并调用python代码来获取该上下文的数据。因此,这将需要大量的努力来重写代码。因此,寻找一些简单的东西。
timeit
在这种情况下没有帮助。他不是在对程序进行基准测试,他想知道他是否能对Python缓慢的启动时间做些什么。或者,你可以检查你是否可以在没有站点文件的情况下使用Python:
Python-s[script]
。没有
-S
python-c'
对我来说需要0.018秒。有了
-S
我就到了
时代python-S-c'
→ 0.004s。请注意,这样您可能会错过一些已安装的软件包。我现在也将此答案发布到我的网站上: