我编写命令行Python脚本已经有一段时间了,但最近我对速度感到非常失望。在
我不一定要讨论处理速度、分派任务或其他命令行工具特定的进程(这通常是一个设计/实现问题),而是简单地运行一个工具来获取帮助菜单,或者显示最少的信息。在
例如,Mercurial在0.080scs左右,GIT在0.030scs左右
我已经研究过Mercurial的源代码(毕竟是Python),但是我仍然无法找到一个快速响应脚本的答案。在
我认为imports
以及你如何管理它们是最初减速的一个重要原因。但是,在Python中,有没有一个快速执行、快速响应的命令行脚本的最佳实践呢?在
一个导入os和optparse并执行main()来解析某些参数选项的Python脚本需要0.160scs才能显示帮助菜单。。。在
这比运行git慢5倍!在
编辑:
我不应该提到git,因为它是用C编写的,但是它的多变部分仍然存在,不,pyc
不觉得有什么大的改进(至少对我来说)。在
编辑2:
虽然惰性导入是Mercurial加速的关键,但它们对慢进口起着关键作用
常规Python脚本中没有自动生成的带有pkg_resources
的脚本,例如:
from pkg_resources import load_entry_point
如果您手动生成了不使用pkg_资源的脚本,那么速度至少会提高2倍。在
但是!请注意,pkg_资源确实提供了一种很好的版本依赖性方法,因此请确保您意识到不使用它基本上意味着可能的版本冲突。在
我很抱歉-但肯定不是0.08秒打扰了你。尽管你不这么说,但感觉你在运行一个“outter”shell(或其他语言)scritp,它在一个循环中调用几百个Python脚本- 这是这些创业时期唯一能起作用的方法。所以,要么在你的问题中隐瞒了这个重要的信息,要么你的父亲是this guy。在
假设你需要一个外部的python脚本,然后按照同样的顺序来编写python脚本。因此,您将减少解释程序启动和每个脚本执行的模块导入。在
例如,这甚至适用于mercurial。您可以导入“mercurial”和相应的子模块,并在其中调用执行与等效命令行参数相同操作的函数
除了编译Python文件,Mercurial还将导入修改为随需应变,这确实减少了启动时间。它在demandimport模块中将
__builtin__.__import__
设置为自己的导入函数。在如果您查看/usr/lib/(或机器上的任何地方)中的hg脚本,您可以在以下几行中看到这一点:
如果将demandimport行更改为
pass
,您将发现启动时间大大增加。在我的机器上,它大概是原来的两倍。在我建议学习需求端口.py看看如何在自己的项目中应用类似的技术。在
p.S.Git,我相信你知道的,是用C语言编写的,所以我并不惊讶它的启动时间很快。在
相关问题 更多 >
编程相关推荐