<p>在第二个循环中,打开和读取file2的次数与读取file1中的键的次数相同。慢可能与底层操作系统(而不是)缓存file2的内容有关。你知道吗</p>
<p>文件2有多大?如果小于计算机上RAM中合理存储的容量(通常为几百MB),请尝试自己缓存:</p>
<pre><code>f = open("file2", "r")
cache = []
for line in f: cache.append(line )
# you now have cache, a list of lines from file2
</code></pre>
<p>然后从第二个块中删除<code>with</code>,并用<code>for line in cache</code>替换第二个<code>for</code></p>
<p>这仍然是严重的次优。最好还是从file2的内容构建一个python dict,这样就可以只访问所需的行,而不是扫描所有行。像这样的</p>
<pre><code>cache = {}
f = open("file2", "r")
for line in f:
t = line.strip().split()
key1 = t[0]
if not key1 in cache: cache[key1] = []
cache[key1].append(line)
key2 = t[1]
if not key2 in cache: cache[key2] = []
cache[key2].append(line)
</code></pre>
<p>几乎重复的代码以简化理解。一般来说,您会在split()生成的行中的单词上运行一个内部循环。你知道吗</p>
<p>现在第二段代码变得简单得多。大纲:</p>
<pre><code>for rs in rs_dict.keys():
if rs in cache:
cached_lines = cache[rs]
# cached_lines is a list of one or more lines containing rs
# as the first or second word
else
# rs wasn't in file2 at all
</code></pre>
<p>由于Python dict使用按键定位实体的数据结构,比检查列表中的每一项要快得多。你知道吗</p>
<p>为了完整性,如果file1和file2都是巨大的(千兆字节以上),您应该将它们的内容加载到sqlite之类的数据库中。数据库在磁盘上做的事情和dict在RAM中做的一样:通过键访问选定的元素比简单地搜索所有记录要有效得多。你知道吗</p>