为什么将字典作为参数传递需要更多时间?

时间:2017-07-04 06:11:17

标签: python dictionary

我尝试了一个leetcode问题。我发现以下代码之一会引发超出时间限制的错误。我创建了以下测试代码。我发现第一个传递字典作为参数需要更多的时间与另一个。 0.94s vs 0.84s。 谁能解释一下呢?

class Solution(object):
    def longestPalindromeSubseq(self, x):
        """
        :type s: str
        :rtype: int
        """

        #dic = {}

        def helper(s, dic):
            if len(s) == 0:
                return 0
            if len(s) == 1:
                return 1

            if s in dic:
                return dic[s]

            if s[0] == s[-1]:
                res = helper(s[1:-1], dic)+2
            else:
                l1 = helper(s[:-1], dic)
                l2 = helper(s[1:], dic)
                res = max(l1,l2)
            dic[s] = res
            #print (id(dic), dic)  
            return res
        d = {}
        ans = helper(x, d)
        #print (id(d), d)
        return ans

class Solution1(object):
    def longestPalindromeSubseq(self, x):
        """
        :type s: str
        :rtype: int
        """

        dic = {}

        def helper(s):
            if len(s) == 0:
                return 0
            if len(s) == 1:
                return 1

            if s in dic:
                return dic[s]

            if s[0] == s[-1]:
                res = helper(s[1:-1])+2
            else:
                l1 = helper(s[:-1])
                l2 = helper(s[1:])
                res = max(l1,l2)
            dic[s] = res
            #print (id(dic), dic)
            return res
        ans = helper(x)
        #print (id(dic), dic)
        return ans

import time
if __name__ == "__main__":
    x = "gphyvqruxjmwhonjjrgumxjhfyupajxbjgthzdvrdqmdouuukeaxhjumkmmhdglqrrohydrmbvtuwstgkobyzjjtdtjroqpyusfsbjlusekghtfbdctvgmqzeybnwzlhdnhwzptgkzmujfldoiejmvxnorvbiubfflygrkedyirienybosqzrkbpcfidvkkafftgzwrcitqizelhfsruwmtrgaocjcyxdkovtdennrkmxwpdsxpxuarhgusizmwakrmhdwcgvfljhzcskclgrvvbrkesojyhofwqiwhiupujmkcvlywjtmbncurxxmpdskupyvvweuhbsnanzfioirecfxvmgcpwrpmbhmkdtckhvbxnsbcifhqwjjczfokovpqyjmbywtpaqcfjowxnmtirdsfeujyogbzjnjcmqyzciwjqxxgrxblvqbutqittroqadqlsdzihngpfpjovbkpeveidjpfjktavvwurqrgqdomiibfgqxwybcyovysydxyyymmiuwovnevzsjisdwgkcbsookbarezbhnwyqthcvzyodbcwjptvigcphawzxouixhbpezzirbhvomqhxkfdbokblqmrhhioyqubpyqhjrnwhjxsrodtblqxkhezubprqftrqcyrzwywqrgockioqdmzuqjkpmsyohtlcnesbgzqhkalwixfcgyeqdzhnnlzawrdgskurcxfbekbspupbduxqxjeczpmdvssikbivjhinaopbabrmvscthvoqqbkgekcgyrelxkwoawpbrcbszelnxlyikbulgmlwyffurimlfxurjsbzgddxbgqpcdsuutfiivjbyqzhprdqhahpgenjkbiukurvdwapuewrbehczrtswubthodv"
    print (x)
    t0 = time.time()
    sol = Solution()
    print (sol.longestPalindromeSubseq(x))
    t1 = time.time()
    print(t1- t0)

    sol1 = Solution1()
    print (sol1.longestPalindromeSubseq(x))
    t2 = time.time()
    print(t2-t1)

1 个答案:

答案 0 :(得分:0)

Python使用通过共享调用调用的东西。该函数仅获取参数的别名。考虑到这一点,传递给函数的内容并不重要。

但脚本可能需要不同的时间来执行。它不是恒定的。使用递归会使预测变得更加困难