python - 加快 datetime.strptime

标签 python python-2.7 datetime profiling strptime

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

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/

相关文章:

mysql - 以 -15 分钟间隔选择日期时间显示错误结果

Python 日期时间转入 MySQL

python - 线性回归预测预测输入数据(测试数据),而不是测试结果

python - main.py 中的第 4 行未定义名称 'turtle'

python-2.7 - 具有自定义颜色的离散值的 matplotlib 热图

python - 如何将 pkgutil.walk_packages 用于压缩包

javascript - 使用 javascript Date.now() 获取延迟值

python - 如何在不影响数据库的情况下重新排序内存缓存

python - 简单LSTM模型: No attr named '_XlaCompile' in name error

python - 如何更正输入框的输出