Почему этот код рекурсии Go такой медленный?(Также требует почти в 10 раз больше памяти, чем Python) - PullRequest
2 голосов
/ 26 сентября 2019

Сравнение скорости алгоритмов на Go, PHP, Ruby, JS, Python на leetcode.Как правило, Go - чемпион, он работает в 20 раз быстрее, чем Python, и использует в несколько раз меньше памяти.Но когда я решаю эту задачу, я обнаруживаю, что это решение Go наиболее подвержено ресурсам.Это требует так много времени и памяти.

Пожалуйста, объясните, почему это происходит.Может быть, я выполняю какой-то жадный код ресурса в Go в текущем рекурсивном решении?

Go: 104 мс, 137,9 МБ

func sortedArrayToBST(nums []int) *TreeNode {
    if 0 == len(nums){
        return nil
    }
    mid := len(nums)/2
    return  & TreeNode{Val: nums[mid], Left: sortedArrayToBST(nums[0:mid]), Right: sortedArrayToBST(nums[mid+1:])  }
}

Python: 84 мс, 16,2 МБ

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        if 0 == len(nums): return None
        mid = int(len(nums)/2)
        answer = TreeNode(nums[mid])
        answer.left = self.sortedArrayToBST(nums[0:mid])
        answer.right = self.sortedArrayToBST(nums[mid+1:])
        return answer

JS: 72 мс, 37,6 МБ

var sortedArrayToBST = function(nums) {
    if( 0 == nums.length) return null;
    let middle = parseInt(nums.length/2)
    let ans = new TreeNode(nums[middle])
    ans.left = sortedArrayToBST(nums.slice(0,middle))
    ans.right = sortedArrayToBST(nums.slice(middle+1))
    return ans;
};

Вот пример стандартного быстрого выполнения Go для задачи рекурсии: https://gist.github.com/lbvf50mobile/15751618dd514385b2dd601155a3aca9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...