<p>在Python(至少<;=2.6.x)中,gzip格式解析是用Python(通过zlib)实现的。而且,它似乎在做一些奇怪的事情,即将<strong>解压到文件末尾</strong>到内存,然后丢弃超出请求的读取大小的所有内容(然后在下次读取时再次执行)。<strong>免责声明</strong>:我刚刚看了<code>gzip.read()</code>三分钟,所以我可能错了。不管我是否理解gzip.read()是否正确,gzip模块似乎没有针对大数据量进行优化。尝试做与Perl中相同的事情,即启动一个外部进程(例如,参见模块<code>subprocess</code>)。在</p>
<hr/>
<p><strong>编辑</strong>
事实上,我错过了OP关于普通文件I/O和压缩文件一样慢的评论(多亏了ire_和_curses指出了这一点)。我觉得这不太可能,所以我做了一些测量。。。在</p>
<pre><code>from timeit import Timer
def w(n):
L = "*"*80+"\n"
with open("ttt", "w") as f:
for i in xrange(n) :
f.write(L)
def r():
with open("ttt", "r") as f:
for n,line in enumerate(f) :
if n % 1000000 == 0 :
print n
def g():
f = gzip.open("ttt.gz", "r")
for n,line in enumerate(f) :
if n % 1000000 == 0 :
print n
</code></pre>
<p>现在,运行它。。。在</p>
^{pr2}$
<p>……喝茶休息后发现它还在运转,我就把它杀了,对不起。然后我试了10万行而不是1万行:</p>
<pre><code>>>> Timer("w(100000)", "from __main__ import w").timeit(1)
0.05810999870300293
>>> Timer("r()", "from __main__ import r").timeit(1)
0.09662318229675293
# here i switched to a terminal and made ttt.gz from ttt
>>> Timer("g()", "from __main__ import g").timeit(1)
11.939290046691895
</code></pre>
<p>模块gzip的时间是O(文件大小**2),因此在行数达到数百万行的情况下,gzip读取时间不能与普通读取时间相同(正如我们通过实验所证实的那样)。匿名旅人,请再次确认。在</p>