Hi Serhiy, I missed the 31st on days range. Thanks for spotting it. I do verify if the datetime tuple is correct by passing them to datetime() and raising exception later on on the code (see https://github.com/Code-ReaQtor/DocCron/blob/1.0.0/doccron/job.py#L180)
Datetime and timedeltas can solve the problem if there is a "pattern" but this is not an efficient way. For example, if there are steps on all the categories or the items have no pattern: datetime_odometer = itertools.product( range(2018, 10_000, 5), # year with steps range(1, 13, 3), # month with steps range(1, 32, 4), # days with steps [0, 5, 6, 10, 13, 24], # hours without steps range(0, 60, 6), # minutes with steps range(0, 60, 2) # seconds with steps ) Datetime and timedelta will create a lot of overhead and is not the best solution. I still believe itertools.product() is the fastest and best solution. Let me read the code for __setstate__ first. Thanks for spotting this! Best Regards, Ronie Martinez On Thu, Oct 25, 2018 at 6:22 PM Serhiy Storchaka <storch...@gmail.com> wrote: > 25.10.18 09:31, Ronie Martinez пише: > > Here is an example: > > > > import itertools > > import time > > > > > > def main(): > > datetime_odometer = itertools.product( > > range(2018,10_000),# year > > range(1,13),# month > > range(1,31),# days > > range(0,24),# hours > > range(0,60),# minutes > > range(0,60)# seconds > > ) > > > > datetime_of_interest = (2050,6,15,10,5,0) > > > > for iin datetime_odometer: > > if i == datetime_of_interest:# target start time > > break > > > > > > if __name__ =='__main__': > > start = time.time() > > main() > > duration = time.time() - start > > print(duration,'seconds')# 91.9426908493042 seconds > > > > > > It took 92 seconds to get to the target start time. It does not only > > apply to datetimes but for other purposes that uses "odometer-like" > > patterns. > > > > I don't have any propose solution for now, but I guess adding this > > feature within itertools will come in handy. > > Thank you for clarification. Now I understand your idea. > > For datetimes it is better to use the datetime classes: > > def iterdatetimes(): > delta = timedelta(microseconds=1) > dt = datetime(2050,6,15,10,5,0) > while True: > yield dt > dt += delta > > Note that in your example you missed 31th days, but iterate 29th and > 30th February. > > See also the calendar module which provides date range iterators > (although not with microsecond precision). > > Currently for general "odometer-like" patterns you can use the > undocumented __setstate__ method of itertools.product. But this is on > your own risk. > > _______________________________________________ > Python-ideas mailing list > Python-ideas@python.org > https://mail.python.org/mailman/listinfo/python-ideas > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/