在查找/更新值时,为什么Python dict比设置的效率更高?

时间:2019-05-18 19:49:03

标签: python python-3.x data-structures

在解决leetcode 3sum问题时,我提交了以下代码:

class Solution1:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        if len(nums) < 3:
            return []
        res = set()
        nums.sort()
        for firstEle in range(len(nums)-2):
            if firstEle > 0 and nums[firstEle] == nums[firstEle - 1]:
                continue
            target = 0 - nums[firstEle]
            dic = {}
            for j in range(firstEle+ 1,len(nums)):
                if target - nums[j] in dic:
                    res.add((nums[firstEle], target - nums[j], nums[j]))
                else:
                    dic[nums[j]] = j
        return list(map(list, res))

的运行时间约为844毫秒。

我将dict替换为set,并修改了代码,如下所示:

class Solution2:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        if len(nums) < 3:
            return []
        res = set()
        nums.sort()
        for firstEle in range(len(nums)-2):
            if firstEle > 0 and nums[firstEle] == nums[firstEle - 1]:
                continue
            target = 0 - nums[firstEle]
            mem = set()
            for j in range(firstEle+ 1,len(nums)):
                if target - nums[j] in mem:
                    res.add((nums[firstEle], target - nums[j], nums[j]))
                else:
                    mem.add(nums[j])
        return list(map(list, res))

那么运行时间约为1044毫秒。

为什么set数据结构会降低效率?

已更新:

我在笔记本电脑上测试了代码:

import timeit
s1 = Solution1()
s2 = Solution2()

print("dict:", timeit.timeit(lambda: s1.threeSum([-1, 0, 1, 2, -1, -4]), number=100000))

print("set:", timeit.timeit(lambda: s2.threeSum([-1, 0, 1, 2, -1, -4]), number=100000))

并得到输出:

dict: 0.671448961016722
set: 0.7314219229156151

环境:

MacBook Pro(13英寸视网膜,2015年初)

CPU:2.7 GHz Intel Core i5

RAM:8 GB 1867 MHz DDR3

Python版本:3.6

似乎set仍然更慢。

1 个答案:

答案 0 :(得分:0)