2017-07-04 44 views
2

我試過一個leetcode問題。我發現以下代碼之一會引發超出時間限制的錯誤。我創建了以下測試代碼。我發現第一個pass字典作爲參數需要更多的時間在另一個。 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) 
+2

傳遞參數比不傳遞參數需要更多的時間。它是什麼類型並不重要。而且,由於您在所有遞歸調用中傳遞參數,因此它會相乘。 – Barmar

回答

0

Python使用的東西,通過共享稱爲電話。該函數只獲取參數上的別名。考慮到這一點,無論你傳遞給函數如何,都無關緊要。

但腳本可能需要不同的時間來執行。它不是恆定的。使用遞歸使預測變得更加困難

相關問題