2013-04-03 23 views
3

我有一个简单的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 

$ time python test.py 

real 0m0.051s 
user 0m0.020s 
sys  0m0.028s 

任何人都可以解释执行时间的差异吗?

我已经为包含外部脚本的php脚本运行了类似的测试,并且该脚本的执行时间的变化可以忽略不计。

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

+0

使用[消息队列](http://www.rabbitmq.com/tutorials/tutorial-six-python.html)可能会有帮助。不要通过shell调用脚本,只需将任务发送到队列并在任务处理完成后运行回调。 – Blender

+0

如果我理解正确,你建议有一个单独的实例与运行这个函数的运行python解释器,从而避免为每个调用启动一个新的进程虚拟机的问题(时间成本)? – user784637

+0

就是这样的。 – Blender

回答

4

可能有几个因素。两个我现在可以认为:

  1. 初始字节编译。

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

  2. 磁盘缓存

    Python解释器,你直接引用,什么那些库使用,都需要从磁盘加载的3个库,从脚本撇开,它的字节码缓存。操作系统缓存这些文件以加快访问速度。

    如果您在同一个系统上运行其他内容,这些文件将从缓存刷新并需要重新加载。

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

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

相关问题