python list.sort() 与 list.sort(key=itemgetter(0))
python list.sort() vs. list.sort(key=itemgetter(0))
我是一个 python 菜鸟,但我正在使用 python 来解决 leetcode 上的问题。
我在 leetcode 上解决了一个(合并重叠间隔)。我有以下代码:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
if len(intervals) < 2: return intervals
intervals.sort(key=itemgetter(0))
merged = [intervals[0]]
for interval in intervals[1:]:
if merged[-1][1] >= interval[0]: merged[-1][1] = max(merged[-1][1],interval[1])
else: merged.append(interval)
return merged
我注意到如果我替换 intervals.sort(key=itemgetter(0))
使用 intervals.sort()
我的性能明显变差(分别为 ~80ms 和 ~110ms)
sort() 在技术上与 sort(key=itemgetter(0)) 不是一样的吗?他们不应该有相同的运行时间吗?
除非,leetcode 只是与重新编码确切的运行时不一致吗?
intervals.sort(key=itemgetter(0))
不同于 intervals.sort()
。
intervals.sort(key=itemgetter(0))
只比较两个区间的第一项,但 intervals.sort()
当第一项相同时比较第二项。所以 intervals.sort(key=itemgetter(0))
可能有更多的间隔看起来与 sort
相同,或者在比较间隔时只做较少的比较。这可能是第一个 运行 更快的原因之一。
另一个可能的原因是优化。另外Python是解释型语言,解释器在运行ning的时候可能会生成二进制代码,做一些优化。哪一个会获得更好的性能取决于解释器。
但根据经验,在大多数在线判断中,30ms左右的差异只是测量误差。
再试一次你可能会得到不同的结果。
您的主要问题已经得到解答。
LeetCode 的性能测量根本不准确。你可以在解决问题时忽略他们的基准数据。
class Solution:
def merge(self, intervals):
merged = []
for interval in sorted(intervals, key=lambda x: x[0]):
if merged and interval[0] <= merged[-1][1]:
merged[-1][1] = max(merged[-1][1], interval[1])
else:
merged.append(interval)
return merged
class Solution:
def merge(self, intervals):
merged = []
for interval in sorted(intervals):
if merged and interval[0] <= merged[-1][1]:
merged[-1][1] = max(merged[-1][1], interval[1])
else:
merged.append(interval)
return merged
参考资料
我是一个 python 菜鸟,但我正在使用 python 来解决 leetcode 上的问题。 我在 leetcode 上解决了一个(合并重叠间隔)。我有以下代码:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
if len(intervals) < 2: return intervals
intervals.sort(key=itemgetter(0))
merged = [intervals[0]]
for interval in intervals[1:]:
if merged[-1][1] >= interval[0]: merged[-1][1] = max(merged[-1][1],interval[1])
else: merged.append(interval)
return merged
我注意到如果我替换 intervals.sort(key=itemgetter(0))
使用 intervals.sort()
我的性能明显变差(分别为 ~80ms 和 ~110ms)
sort() 在技术上与 sort(key=itemgetter(0)) 不是一样的吗?他们不应该有相同的运行时间吗? 除非,leetcode 只是与重新编码确切的运行时不一致吗?
intervals.sort(key=itemgetter(0))
不同于 intervals.sort()
。
intervals.sort(key=itemgetter(0))
只比较两个区间的第一项,但 intervals.sort()
当第一项相同时比较第二项。所以 intervals.sort(key=itemgetter(0))
可能有更多的间隔看起来与 sort
相同,或者在比较间隔时只做较少的比较。这可能是第一个 运行 更快的原因之一。
另一个可能的原因是优化。另外Python是解释型语言,解释器在运行ning的时候可能会生成二进制代码,做一些优化。哪一个会获得更好的性能取决于解释器。
但根据经验,在大多数在线判断中,30ms左右的差异只是测量误差。 再试一次你可能会得到不同的结果。
您的主要问题已经得到解答。
LeetCode 的性能测量根本不准确。你可以在解决问题时忽略他们的基准数据。
class Solution:
def merge(self, intervals):
merged = []
for interval in sorted(intervals, key=lambda x: x[0]):
if merged and interval[0] <= merged[-1][1]:
merged[-1][1] = max(merged[-1][1], interval[1])
else:
merged.append(interval)
return merged
class Solution:
def merge(self, intervals):
merged = []
for interval in sorted(intervals):
if merged and interval[0] <= merged[-1][1]:
merged[-1][1] = max(merged[-1][1], interval[1])
else:
merged.append(interval)
return merged