代码之家  ›  专栏  ›  技术社区  ›  Diego L

在python中使用del或dictionary理解更有效吗?

  •  1
  • Diego L  · 技术社区  · 1 年前

    假设我有一个python字典,其结构如下:

    data = {
    "key_1": "some value",
    "key_2": "some value",
    "key_3": "",
    "key_4": ""
    }
    

    所以,我想删除所有键值,其中的值是空字符串。 我可以通过以下方式使用python one:

    for key in list(data.keys()):
        if data[key] == "":
            del data[key]
    

    或者,我可以根据以下理解构建一本新词典:

    new_ dict = {
                key: value
                for key, value in data.items()
                if value != ""
            }
    

    这两种解决方案都可读性很强,但哪种更有效,为什么?

    1 回复  |  直到 1 年前
        1
  •  -1
  •   leaf_yakitori    1 年前
    • 看起来这两个解决方案的时间复杂度相同,但在python中,实际运行时间可能不同。
    • 构建一个有理解力的新字典是编写代码的最愚蠢的方式,但构建整个字典会花费更多的时间 del way在这两种情况下都表现良好。
    • 抱歉我犯了很多错误。

    测试代码

    import timeit
    def build_data():
        return {f"{i}": f"{i}" for i in range(999)} | {"blank":""}
    
    def build_half_blank_data():
        return {f"{i}": f"{i}" for i in range(500)} | {f"{i}": "" for i in range(500,1000)}
    
    def del_method(data):
        for key in [key for key, value in data.items() if value == ""]:
            del data[key]
        return data
    
    def build_method(data):
        return {key: value for key, value in data.items() if value != ""}
    
    def print_time(fun):
        print(timeit.Timer(fun).timeit(100))
    
    data = build_data()
    print_time(lambda: del_method(data))
    half_blank_data = build_half_blank_data()
    print_time(lambda: del_method(half_blank_data))
    data = build_data()
    print_time(lambda: build_method(data))
    half_blank_data = build_half_blank_data()
    print_time(lambda: build_method(half_blank_data))
    
    • 后果
    ---del_method + data         0.006248708003113279 seconds ---
    ---del_method + half_blank   0.003282875000877538 seconds ---
    ---build_method + data       0.010706582997954683 seconds ---
    ---build_method + half_blank 0.008546333003323525 seconds ---