分享

Python时间库性能比较

 River_LaLaLa 2016-08-21

Python datetime库的主要替代者都有着相似的目标,易用/简单/用户友好.这些目标很赞,我很喜欢这些替代库,所以我投入了大量的精力去研究它们.这里我想研究的是,使用这些替代库会对程序的性能产生什么样的影响?

为什么要担心时间库的性能?因为时间库的使用无处不在.大量使用时间库的Web服务/数据库/数据处理程序,都对性能的要求十分苛刻.想想如果你正在为提高每秒请求数而发愁,而这时引进了一个库让性能下降了一半,我相信你一定会考虑换一个替代品的.

那些抱着"如果要效率,那你为什么用Python?"这样想法的人,一定没有听说过PyPy,不知道当今的Python程序的效率已经被优化到了何种程度.

我设置了一个标准来比对Python是时间库的替代品,datetime, Arrow, Pendulum, Delorean 和 udatetime.我选择了4个典型的性能指标来测量这些库的效率.

  • 解析一个时间字符串

  • 序列化一个时间字符串

  • 在UTC时间下实例化当前时间的对象

  • 在本地时间下实例化当前时间的对象

  • 在UTC时间下从时间戳计算一个时间的对象

  • 在本地时间下从时间戳计算一个时间的对象

坦率地说,udatetime这个库的主要目的就是优化性能.这里把它拉进来做对比,是为了展示性能优化可以做到什么程度.

这个性能测试的执行环境是Python2.7, PyPy和Python3.5.测试代码每轮会被运行一百万次,结果取3轮的最小值.


上图可见,无论使用什么解释器,结果都是差不多的.udatetime是最快的,在PyPy上尤甚.总体来看,datetime比udatetime慢了3倍,Arrow慢了10倍,Delorean慢了13倍,Pendulum慢了18倍.

如果我们抛开在Python2.7和Python3.5上的结果,这样我们就可以比较在纯Python代码下的性能差距,因为在PyPy下面没有C语言代码优化的情况.这种情况下datetime比udatetime慢5倍,Arrow慢12倍,Delorean慢13倍,Pendulum慢18倍.

有人说,给代码做性能优化一定要能将性能提升一个数量级,这样才值得.我想上面的测试表明,udatetime的性能优化是值得的.

一个值得关注的测试结果是解析的性能,我认为Arrow 和 Pendulum在解析上比datetime慢是正常的,因为它们需要尝试更多的格式,但是没想到结果是这样的.


如果你经常解析时间字符串,那你需要认真考虑下你要使用的工具了.在解析字符串时,datetime比udatetime慢4倍,Arrow慢16倍,Pendulum慢19倍,Delorean更是慢了20倍.这些库慢的原因一定程度上是因为底层都使用了dateutil.

下面是在Python2.7和Python3.5下面的执行结果

我希望这篇文章清楚地说明了不同库之间的性能差距.你不必重新造轮子,但是你需要思考哪个轮子更合适你.


英文原文:https:///blog/2016/08/04/datetime-vs-Arrow-vs-Pendulum-vs-Delorean-vs-udatetime.html

译者:诗书塞外

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多