将数据转换为列表的函数是否使用更多内存?

时间:2017-11-08 17:40:27

标签: python loops memory data-structures

*我知道datetime可以作为解决此问题的有效方法,但我还是初学者,并且想了解为什么此代码没有显示所需的输出 < / p>

以下代码生成一条错误消息,指出程序使用了13秒CPU,因此它已结束。

我不明白为什么这段代码占用了这么多内存,原来下面的函数没有将它们的输入转换成列表,但是我这样做了所以我们可以改变每个参数,直到IsBefore中的条件返回False,这将结束while循环并为start_date上的nextDay函数的总迭代返回更新的“number_of_days”。

编辑:我将项目转换为列表,因为我不确定是否

year1, month1, day1 = nextDay(year1,month1,day1)  

会正确更新这些值

def nextDay(year, month, day):
    """Simple version: assume every month has 30 days"""
    date=[year,month,day]
    if date[2] < 30:
        return [year, month, day + 1]
    else:
        if date[1] == 12:
            return [year + 1, 1, 1]
        else:
            return [year, month + 1, 1]

def IsBefore(year1, month1, day1, year2, month2, day2):
    Before=[year1,month1,day1]
    Current=[year2,month2,day2]
    if (Before[0]>Current[0]) or (Before[0]==Current[0] and Before[1]>Current[1]) or (Before[0]==Current[0] and Before[1]==Current[1] and Before[2]>Current[2]):
        return False
    else:
        return True

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    number_of_days=0
    start_date=[year1,month1,day1]
    while IsBefore(year1, month1, day1, year2, month2, day2)==True:
        start_date=nextDay(year1,month1,day1)
        number_of_days+=1
    return number_of_days


def test():
    test_cases = [((2012,9,30,2012,10,30),30), 
                  ((2012,1,1,2013,1,1),360),
                  ((2012,9,1,2012,9,4),3)]

    for (args, answer) in test_cases:
        result = daysBetweenDates(*args)
        if result != answer:
            print "Test with data:", args, "failed"
        else:
            print "Test case passed!"

test()

1 个答案:

答案 0 :(得分:0)

  

我将这些项目转换为列表,因为我不确定是否

year1, month1, day1 = nextDay(year1,month1,day1)
     

会正确更新这些值

你完全向后。现在你做的时候:

start_date=[year1,month1,day1]
while IsBefore(year1, month1, day1, year2, month2, day2)==True:
    start_date=nextDay(year1,month1,day1)
    number_of_days+=1
return number_of_days

然后year1, month1, day1永远不会受到影响,并且您不断将同一个valeus传递给while IsBefore(...),这可能解释了为什么您的代码没有按照您的意愿行事。

考虑:

>>> x, y, z = 1, 2, 3
>>> def f(): return 42, 88, 99
...
>>> a_list = [x, y, z]
>>> a_list = f()
>>> a_list
(42, 88, 99)
>>> x, y, z
(1, 2, 3)

你的程序耗时太长,因为你创造了一个无限循环,而不是因为记忆。

此外,除此之外,除非您有充分的理由使用Python 2,例如你的老板正在制造你,你正在维护一个Python 2中的工作代码库,或者你的教授正在制造你,那么你应该真正学习Python 3。