<p>这段代码是完全的线性搜索。难怪它跑得很慢。如果不了解更多关于输入的信息,我无法就如何解决这些问题向您提供建议,但我至少可以指出问题所在。我会记下主要的问题,还有几个小问题。在</p>
<pre><code>udict = {}
for line in infile1:
line = line.strip()
linelist = line.split('\t')
udict1 = {linelist[0]:linelist[1]}
udict.update(udict1)
</code></pre>
<p>此处不要使用<code>update</code>;只需将该项添加到字典中:</p>
^{pr2}$
<p>这比为每个条目创建字典要快。(实际上,<a href="https://stackoverflow.com/a/10249985/577088">Sven Marnach</a>基于生成器的方法来创建这个字典更好。)这是相当小的。在</p>
<pre><code>mult10K = []
for x in range(100):
mult10K.append(x * 10000)
</code></pre>
<p>这完全没有必要。删除这个;我将向您展示一种不使用这个间隔打印的方法。在</p>
<pre><code>linecounter = 0
for line in infile2:
for key, value in udict.items():
</code></pre>
<p>这是你的第一个大问题。你在字典中对每一行的键进行线性搜索。如果字典非常大,这将需要大量的操作:100000000*len(udict)。在</p>
<pre><code> matches = line.count(key)
</code></pre>
<p>这是另一个问题。您正在使用线性搜索查找匹配项。然后执行<code>replace</code>,它执行相同的线性搜索!不需要检查匹配项;<code>replace</code>如果没有匹配项,则返回相同的字符串。这也不会有什么大的不同,但它会给你带来一些东西。在</p>
<pre><code> line = line.replace(key, value)
</code></pre>
<p>继续进行这些替换,然后只在所有替换完成后才写下该行:</p>
<pre><code> outfile.write(line + '\n')
</code></pre>
<p>最后</p>
<pre><code> linecounter += 1
if linecounter in mult10K:
</code></pre>
<p>原谅我,但这样做太荒谬了!您正在通过<code>linecounter</code>进行线性搜索,以确定何时打印一行。在这里,这又增加了将近100000000*100个操作。你应该至少在一个集合中搜索;但是最好的方法(如果你真的必须这样做的话)是做一个模运算并测试它。在</p>
<pre><code> if not linecounter % 10000:
print linecounter
print (datetime.now()-startTime)
</code></pre>
<p>为了使这段代码高效,您需要去掉这些线性搜索。<a href="https://stackoverflow.com/a/10249985/577088">Sven Marnach</a>的回答建议了一种可能有效的方法,但我认为这取决于文件中的数据,因为替换键可能不符合明显的单词边界。(不过,regex方法添加了地址。)</p>