Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化时间范围函数_Python_Performance_Datetime_Optimization - Fatal编程技术网

Python 优化时间范围函数

Python 优化时间范围函数,python,performance,datetime,optimization,Python,Performance,Datetime,Optimization,我想优化Python函数的执行时间,该函数大量使用内置的datetime实用程序。我的函数按原样工作,但速度很慢 # Check if an ending date (stored in a YYYY-MM-DD string) is # within range of a beginning date (in the same format). Two # numbers, the min/max length, define how soon/distant the 2nd # date c

我想优化Python函数的执行时间,该函数大量使用内置的
datetime
实用程序。我的函数按原样工作,但速度很慢

# Check if an ending date (stored in a YYYY-MM-DD string) is
# within range of a beginning date (in the same format). Two
# numbers, the min/max length, define how soon/distant the 2nd
# date can be from the 1st.

minDelayLength = 1
maxDelayLength = 999

def checkDateRange(dateStr1, dateStr2):
    date1 = datetime.strptime(dateStr1, '%Y-%m-%d')
    date2 = datetime.strptime(dateStr2, '%Y-%m-%d')

    minLimit = date1 + timedelta(days=minDelayLength)
    maxLimit = date1 + timedelta(days=maxDelayLength)

    return minLimit <= date2 <= maxLimit

有人对如何改进我的功能有什么建议吗?我可以假设函数的输入总是有效的(格式正确),并且我可以假设最小/最大长度不会改变

代码最慢的部分是
strtime
。如果您确定日期字符串的格式始终为
YYYY-MM-DD
,则可以使用下面的方法,使其速度提高11倍(在500000次调用中测试)

从datetime导入datetime、timedelta、date
minDelayLength=timedelta(天数=1)
maxDelayLength=timedelta(天数=999)
def checkDateRange(dateStr1、dateStr2):
date1=日期(int(dateStr1[:4])、int(dateStr1[5:7])、int(dateStr1[8:10]))
date2=日期(int(dateStr2[:4])、int(dateStr2[5:7])、int(dateStr2[8:10]))

返回日期1+记住时间非常感谢!这是一个极好的答案。您没有讨论它,但将长度初始化为timedelta的方式是另一个很好的改进。我和以前一样,在1000000次调用中对这段新代码进行了基准测试,现在它运行时间为3.5秒,而之前为40.0秒。
2634 function calls (2548 primitive calls) in 0.050 seconds
from datetime import datetime, timedelta, date

minDelayLength = timedelta(days=1)
maxDelayLength = timedelta(days=999)

def checkDateRange(dateStr1, dateStr2):
    date1 = date(int(dateStr1[:4]), int(dateStr1[5:7]), int(dateStr1[8:10]))  
    date2 = date(int(dateStr2[:4]), int(dateStr2[5:7]), int(dateStr2[8:10]))  

    return date1 + minDelayLength <= date2 <= date1 + maxDelayLength