对Python脚本做简单的profiling

最近事情好多,Blog好久没有更新了。今天上来写写最近解决的一个Python里的性能优化问题。

起因

之前为项目写过一个Sqlite数据库预处理的Python脚本,里面主要做了张新表,把其他表的数据填进去。当时主要考虑到维护性,条理清楚,就没太考虑Performance。之后QA发现模块的运行比原来慢了20倍,因为还是挺快,所以没有当时马上修正。

Profiling

这次Release要修掉这个问题。我的原则是,改进Performance一定要做Profiling,做到有的放矢才。

和Java的VirtualVM类似,Python 2.7也内置了几个Module做Profiling,我选择了cProfile。基本就是如下命令:

“-s tottime”是让结果用总执行时间排序。

优化之前的执行结果,

可见罪魁祸首就是sqlite3的Cursor的execute()方法,和原本猜测的也是一样的。优化的手法也很明确就是减少execute()的调用次数,使用batch和合并SQL语句的办法,很容易就用空间换回了时间。

优化之后的结果,

优化之后只是原来的9%的Runtime。

总结

  • 继续坚持用Profiler来做Performance的改进。
  • 边改边用Profiler查看Performance有没有提升。
  • 不要过分优化,否则代码没法看了。😀

References

强大的XPath

最近的项目开发中常常要分析XML,深切体会到XPath的强大和方便。Java可以使用DOM4j,Python 2.5以后可以使用了etree。

举个小例子,如果有如下XML:

要去掉所有<B>的节点,XPath可以如何做呢?

XPath的灵活之处就在于,可以用简单明了的Path控制想要读取的节点。

其实还有很多有趣的特性,可以看看XPath Tutorial

关于Perl语言基本知识的学习总结

老大走了,同时留了大约7,8千行的Perl脚本给我们维护。以前Perl没学过,这两天大概看了一下,现在做下简单的总结。

总的感觉是:Perl语言真的很简洁!

变量

Perl的变量类型分成了几种:标量类型,数组类型,联合类型(理解成Map比较好)。

比如:

NOTE:其实还有引用类型,只是现在还没有用到,先不总结了。

流程控制

这个部分和其他语言很像,但有些地方会再简洁,Larry果然真的确实”很懒”。

条件控制

循环控制

和C很像,就是有的地方别忘了加上$, 如:

函数

基本语法

包(Package)

package定义一个包,如:

最后的”1;”非常重要,不然别的脚本就无法使用这个包。Perl里的True/False很像Python里定义的。

那如何使用呢,也很简单。

有几个小问题:

  1. 包的搜索路径在@INC中,如有需要,要在开始加

总结

这些就是Perl的基本内容,再把正则表达式看一下就可以开始读代码的了。