理解列表与 for 循环的复杂性

Dav*_*vid 0 python python-3.x

我在 Python 中有两种算法,它们将元组列表转换为字典:

  def _prep_high_low_data_for_view(self, low_high_list):
    dates = []
    prices = []
    lables = []
    for (x, y, z) in low_high_list:
        dates.append(x)
        prices.append(y)
        lables.append(z)

    return {'date': dates,
            'price': prices,
            'label': lables
            }
Run Code Online (Sandbox Code Playgroud)

第二个是:

    def _prep_high_low_data_for_view(self, low_high_list):
    return {'date': [date for date, _, _ in low_high_list],
            'price': [price for _, price, _ in low_high_list],
            'label': [lable for _, _, lable in low_high_list],
            }
Run Code Online (Sandbox Code Playgroud)

两种算法就它们的作用而言是等效的。是不是第二种算法在复杂度方面更差,因为有三个单独的列表推导式?

Ala*_* T. 5

您可以使用 zip 构建 3 个列表:

dates,prices,labels = zip(*low_high_list)
Run Code Online (Sandbox Code Playgroud)

放在一个单行函数中:

def third_function(low_high_list):
    return dict.fromkeys(zip(["date","price","label"],zip(*low_high_list)))
Run Code Online (Sandbox Code Playgroud)

平均而言,它会比 Florian_H 的 second_function() 运行得更快。

测试和结果:

def third_function(low_high_list):
    return dict.fromkeys(zip(["date","price","label"],zip(*low_high_list)))

def fourth_function(low_high_list):
    dates,prices,labels = zip(*low_high_list)
    return { "date":dates, "price":prices, "label":labels }


lst = [tuple(random.randint(0,100) for _ in range(3)) for i in range(10000)]

from timeit import timeit
count = 1000

t0 = timeit(lambda:first_function(lst), number=count)
print("first_function: ",f"{t0:.3f}","1x" )

t = timeit(lambda:second_function(lst), number=count)
print("second_function:",f"{t:.3f}",f"{t0/t:.1f}x" )

t = timeit(lambda:third_function(lst), number=count)
print("third_function: ",f"{t:.3f}",f"{t0/t:.1f}x" )

t = timeit(lambda:fourth_function(lst), number=count)
print("fourth_function:",f"{t:.3f}",f"{t0/t:.1f}x" )

# first_function:  1.338 1x
# second_function: 0.818 1.6x
# third_function:  0.426 3.1x
# fourth_function: 0.375 3.6x
Run Code Online (Sandbox Code Playgroud)