gpt4 book ai didi

python - 加快 datetime.strptime

转载 作者:太空狗 更新时间:2023-10-30 02:45:27 24 4
gpt4 key购买 nike

我正在使用以下代码从字符串中提取日期:

try:
my_date = datetime.strptime(input_date, "%Y-%m-%d").date()
except ValueError:
my_date = None

如果我运行此 750,000 次,则需要 19.144 秒(由 cProfile 确定)。现在,我将其替换为以下(丑陋的)代码:

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

如果我运行这个 750,000 次,它只需要 5.946 秒。但是,我发现代码真的很难看。有没有另一种不使用 strptime 从字符串中提取日期的快速方法?

最佳答案

是的,如果您放弃很多灵 active 和验证,有比 datetime.strptime() 更快的方法来解析日期。 strptime() 允许带零填充和不带零填充的数字,它只匹配使用正确分隔符的字符串,而你的“丑陋”版本则不允许。

您应该始终使用 timeit module对于计时赛,它比此处的 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

关于python - 加快 datetime.strptime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24626354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com