是什么导致此python脚本的执行时间发生变化?

是什么导致此python脚本的执行时间发生变化?,python,Python,我有一个简单的python脚本,但是当它在一段时间内第一次运行时,它显示了更高的执行时间。如果我马上执行它,速度会快一些 该脚本在私有测试服务器上运行,没有运行任何应用程序,因此我不认为缺乏系统资源是导致它运行较慢的原因 #!/usr/bin/env python import redis,time,sys print "hello" $ time python test.py real 0m0.149s user 0m0.072s sys 0m0.076s $ ti

我有一个简单的python脚本,但是当它在一段时间内第一次运行时,它显示了更高的执行时间。如果我马上执行它,速度会快一些

该脚本在私有测试服务器上运行,没有运行任何应用程序,因此我不认为缺乏系统资源是导致它运行较慢的原因

#!/usr/bin/env python
import redis,time,sys
print "hello"


$ time python test.py

real    0m0.149s
user    0m0.072s
sys     0m0.076s

$ time python test.py

real    0m0.051s
user    0m0.020s
sys     0m0.028s
有人能解释执行时间的差异吗

我对包含外部脚本的php脚本进行了类似的测试,该脚本的执行时间变化可以忽略不计


这种差异会影响我的应用程序,因为这样的脚本会被多次调用,并导致响应在70ms到450ms之间传递。

可能有几个因素。我现在可以想到两个:

  • 初始字节编译

    Python将编译的字节码缓存在
    .pyc
    文件中,第一次运行时需要创建该文件,后续运行只需验证字节码缓存上的时间戳

  • 磁盘缓存

    Python解释器,您直接引用的3个库,这些库使用的任何东西,都需要从磁盘加载,与脚本及其字节码缓存完全不同。操作系统缓存这些文件,以便更快地访问

    如果在同一系统上运行其他程序,这些文件将从缓存中刷新,需要重新加载

    这同样适用于目录列表;在模块搜索路径中查找模块的位置的检查以及字节码缓存的测试都是通过缓存的目录信息来加快的


  • 如果启动时间影响应用程序,请考虑创建一个守护进程,将这些任务作为服务来服务。RPC调用(使用套接字或本地主机网络连接)几乎总能超过这些启动成本。消息队列可以为您提供此类守护进程的体系结构。

    使用消息队列可能会有所帮助。您不需要通过shell调用脚本,只需将任务发送到队列,并在处理完任务后运行回调。如果我理解正确,您建议使用一个单独的实例和一个运行python解释器来运行此函数,从而避免为每个调用启动一个新进程VM的问题(时间成本)?