是的,如果你放弃很多灵活性和验证,解析日期的速度比datetime.strptime()
更快。 strptime()
允许带有或不带有零填充的数字,并且仅匹配使用正确分隔符的字符串,而您的“丑陋”版本则不会。
您应该始终使用timeit
模块进行时间测试,它比cProfile
更准确。
实际上,您的“丑陋”方法比strptime()
快两倍:
>>> from datetime import date, datetime
>>> import timeit
>>> def ugly(input_date):
... a= 1000 * int(input_date[0])
... b= 100 * int(input_date[1])
... c= 10 * int(input_date[2])
... d= 1 * int(input_date[3])
... year = a+b+c+d
... c= 10 * int(input_date[5])
... d= 1 * int(input_date[6])
... month = c+d
... c= 10 * int(input_date[8])
... d= 1 * int(input_date[9])
... day = c+d
... try:
... my_date = date(year, month, day)
... except ValueError:
... my_date = None
...
>>> def strptime(input_date):
... try:
... my_date = datetime.strptime(input_date, "%Y-%m-%d").date()
... except ValueError:
... my_date = None
...
>>> timeit.timeit('f("2014-07-08")', 'from __main__ import ugly as f')
4.21576189994812
>>> timeit.timeit('f("2014-07-08")', 'from __main__ import strptime as f')
9.873773097991943
你的方法可以改进一下,可以使用切片操作:
>>> def slicing(input_date):
... try:
... year = int(input_date[:4])
... month = int(input_date[5:7])
... day = int(input_date[8:])
... my_date = date(year, month, day)
... except ValueError:
... my_date = None
...
>>> timeit.timeit('f("2014-07-08")', 'from __main__ import slicing as f')
1.7224829196929932
现在速度快了近6倍。我还将
int()
调用移动到
try
-
except
中,以处理在将字符串转换为整数时出现的无效输入。
你也可以使用
str.split()
来获取部分,但这会使它稍微变慢:
>>> def split(input_date):
... try:
... my_date = date(*map(int, input_date.split('-')))
... except ValueError:
... my_date = None
...
>>> timeit.timeit('f("2014-07-08")', 'from __main__ import split as f')
2.294667959213257
timeit
进行时间测试,而不是cProfile
。我并不是说结果会有所不同,但这样做肯定更准确。 - Martijn Pietersyear = int(input_date[:4])
这样的代码呢?try
语句块是用来防止无效的日期格式导致索引失败的。 - jonrsharpetimeit
。 - Martijn Pieters