<p>这主要是一个I/O问题。你知道吗</p>
<pre><code>for j in range(numberOfObjects):
fout = outputFileObject .read(recordSize)
</code></pre>
<p>您的大部分时间都是在读取文件中的少量增量位(即一次读取一条记录),然后使用<code>struct</code>解压这些单独的记录。这太慢了。相反,一次抓取你想要的文件的<em>整个</em>块,然后让<code>struct.unpack</code>以C的速度翻滚。你知道吗</p>
<p>您将需要做一点数学来计算<code>read</code>需要多少字节,并更改<code>recordFormat</code>格式字符串来告诉<code>struct</code>如何解包整个内容。你的例子中没有足够的信息让我更准确地告诉你应该怎么做。你知道吗</p>
<p>我还要指出:</p>
<pre><code>tuple([j+1, analysisNumber, i] + [x for x in list(struct.unpack(recordFormat, fout))])
</code></pre>
<p>是不是写得更理智了</p>
<pre><code>(j+1, analysisNumber, i) + struct.unpack(recordFormat, fout)
</code></pre>
<p>…但是如果您按照我上面的建议完全删除循环,则需要重构该行。(您可以使用<code>zip</code>和<code>enumerate</code>在整个解包之后将数据预处理到每个结构成员上)</p>
<hr/>
<p><strong>编辑:</strong>示例。我把一百万个未签名的整数打包到一个文件中。<code>yours()</code>是你的方法,<code>mine()</code>是我的方法。你知道吗</p>
<pre><code>def yours():
res = []
with open('packed', 'rb') as f:
while True:
b = f.read(4)
if not b:
break
res.append(struct.unpack('I',b))
return res
def mine():
with open('packed', 'rb') as f:
return struct.unpack('1000000I',f.read())
</code></pre>
<p>时间安排:</p>
<pre><code>%timeit yours()
1 loops, best of 3: 388 ms per loop
%timeit mine()
100 loops, best of 3: 6.14 ms per loop
</code></pre>
<p>所以,大约有两个数量级的差异。你知道吗</p>