求问:除datetime.timezone外,是否存在datetime.tzinfo的C语言实现?
针对你遇到的性能瓶颈,我有几个实用的方向可以尝试:
自己移植CPython 3.7+的
datetime.timezoneC代码
CPython的datetime模块源码是开源的,你可以从官方仓库里提取3.7版本Modules/_datetimemodule.c中timezone相关的实现代码,然后适配到Python 3.6及以下版本。需要注意处理不同版本C API的差异,比如旧版本中tzinfo的底层结构体定义、方法注册方式的小区别,还有严格管理Python对象的引用计数。这种方式能让你获得和3.7+原生datetime.timezone一致的性能,而且完全可控。参考现有C实现的ISO8601解析库
比如ciso8601这个纯C实现的ISO8601解析库,它支持Python 2.7到3.x的旧版本,内部自己实现了轻量级的固定偏移时区处理逻辑。你可以查看它的源码,借鉴其中的C语言时区实现——因为它不需要处理复杂的DST切换,刚好匹配ISO8601解析中常见的固定偏移场景,直接提取或修改后集成到你的库中即可。实现轻量级自定义C tzinfo类型
如果你只需要处理固定偏移的时区(就像pytz.FixedOffset那样),完全没必要移植完整的datetime.timezone。可以自己写一个极简的C扩展类型:- 定义一个C结构体存储时区偏移量(以秒为单位)
- 实现tzinfo要求的核心方法:
utcoffset()、dst()(固定返回None)、tzname() - 通过Python的C API将这个类型注册为Python的
tuple子类或者独立类型
这种实现非常轻量,性能会比Python实现的FixedOffset快很多,而且适配旧版本Python的成本很低。
用Cython封装现有Python tzinfo实现
如果你不想写纯C代码,Cython是个折中方案:把pytz.FixedOffset或者你自己的简单Python tzinfo类用Cython封装,编译成C扩展模块。这样既能保留Python代码的可读性,又能获得接近纯C的性能,而且适配旧版本Python的工作量更小。
内容的提问来源于stack exchange,提问作者movermeyer

