whusnoopy
2022-03-13 09:11:21 +08:00
这个不是 Python 的问题,是算法时间复杂度的问题,虽然有一部分和语言或系统相关的性能开销(如磁盘 IO 啥的)
你原始的做法是把两个文件打开,然后双重循环按行比较,这是 O(n^2) 的时间复杂度,O(1) 的空间复杂度(不算读取文件本身的空间开销)
如果按楼上说的用 dict (其实就是 hash ),先读文件 A ,这是 O(n) 的时间复杂度,为了构建这个 dict 需要额外的 O(n) 的空间复杂度,然后拿着这个 dict 去遍历文件 B 来做比较,又是 O(n)*O(1) 的时间复杂度(按行读取和每次比较),总的时间复杂度是 O(n),空间复杂度是 O(n)
如果用排序后比较,先对文件 A 和文件 B 读取后排序,这需要 O(nlogn) 的时间复杂度(排序的开销),存储两个排序后的文件需要 O(n) 的空间复杂度(没有额外开销,只是需要存着),然后用归并的思路对两个排序后的列表双指针遍历,这是 O(n) 的时间复杂度,总的时间复杂度是 O(nlogn),空间复杂度是 O(n)
综上,排序后比较有更高的时间复杂度和算法开销(能很快完整写对双指针遍历且处理好边界情况的三脚猫程序员并不多),不如直接用 dict ,就是第二个文件顺序读一遍,把每行内容作为 key 放进一个 dict ,然后遍历第一个文件,如果第一个文件行内容的 key 不在 dict 里,那就是 a 文件这行内容不存在 b 文件里