下面两个方法做同样的事情。哪一个在时间/空间复杂性方面更有效?
** Method A**
for student in group.students:
for grade in student.grades:
some_operation(grade)
** Method B**
for grade in [grade for student in group.students for grade in student.grades]
some_operation(grade)
方法B看起来很奇怪而且多余。可以缩短为:
[some_operation(grade) for student in group.students for grade in student.grades]
但是方法A无论如何都更好,因为它不创建列表。简单地把列表扔掉会让读者感到困惑,而且会浪费内存。
它们具有相同的时间复杂度,O(nm)
,因为它是一个循环在另一个循环上。所以,n
是group.students
, m
是students.grades
。从功能上讲,这些时间复杂度也应该是相同的,因为它在两个列表上迭代。