2015-11-04 51 views
1

我有超过100万个来自数据库的datetime对象,并且我想将它们中的每个转换为支持时区的datetime对象。这里是我的助手funcion conv_tz:pytz时区转换性能

# dt is python datetime object, src_tz and dest_tz and pytz.timezone objects 
def conv_tz(dt, src_tz, dest_tz): 
    if not dt: return None 
    sdt = src_tz.localize(dt) 
    return sdt.astimezone(dest_tz) 

这里从探查结果:

ncalls tottime percall cumtime percall filename:lineno(function) 
1101475 1.166 0.000 44.440 0.000 ../release/python/lib/dtutil.py:128(conv_tz) 
1101475 9.092 0.000 35.656 0.000 /app/python/lib/python3.4/site-packages/pytz/tzinfo.py:244(localize) 

问题1:有没有无论如何要使其运行速度更快?假设数据库中的每个datetime对象都位于pytz.timezone('America/New_York')中,并且目标时区因日期时间对象而异(或数据库中的每一行)

事实上,时区感知DateTime对象,我真正想实现的是将这些DateTime对象,MATLAB时间因此,这里是to_mat功能我使用(未时区知道。):

def to_mat(dt): 
    if not dt: return None 
    val = dt.toordinal() + 366 
    t = dt.time() 
    return val + (((t.hour * 60) + t.minute) * 60 + t.second)/float(_seconds_day) + t.microsecond/1.0e6/_seconds_day 

我打电话这2功能一起用于超过100万个日期时间对象:

matdt = dtutil.to_mat(dtutil.conv_tz(dt, pytz.timezone('America/New_York'), dst_tz)) 

问题2:也许有更好的方法一起完成这些转换?这里是to_mat的剖析,这似乎更短的时间比conv_tz耗时:

3304425 5.067 0.000 5.662 0.000 ../release/python/lib/dtutil.py:8(to_mat) 

环境:CentOS6的x64 + x64的Python3.4.3为

塞巴斯蒂安J.F.
+0

看起来大部分时间都是在'localize()'函数中,在一般情况下是复杂的。对于America/New_York区域,您可以将其简化为已知的日期范围。 – jfs

+0

日期时间范围从2009-01-01到当前时间。数据库中的项目会在DST更改日发生,就像过去的星期天一样,如果我在某些日期修正了偏移量,则会产生一些问题。这就是为什么我选择让底层pytz在计算正确的偏移量方面做所有工作,尤其是在DST切换日期。 – fivelements

+0

我是否说过你应该忽略DST? - 不,看看[localize()'源代码](http://bazaar.launchpad.net/~stub/pytz/devel/view/head:/src/pytz/tzinfo.py):你不' t需要所有复杂性(更糟糕的是,只需通过'_utc_transition_times'进行简单的二分搜索即可),以计算输入的两个UTC偏移量。 – jfs

回答

2

感谢评论!以下是我决定使用,假设这些DATATIME对象的默认时区是与操作系统时区一致:

def conv_tz2(dt, dest_tz): 
    if not dt: return None 
    return datetime.fromtimestamp(dt.timestamp(), dest_tz) 

,它运行原conv_tz的一小部分。这是一个基于50万转换的测试:

ncalls tottime percall cumtime percall filename:lineno(function) 
567669 0.664 0.000 23.354 0.000 ../test/test_tz.py:17(conv_tz) 
567669 4.831 0.000 18.732 0.000 /app/python/lib/python3.4/site-packages/pytz/tzinfo.py:244(localize) 
567669 0.472 0.000 5.786 0.000 ../test/test_tz.py:22(conv_tz2)