<p>作为“Python源代码”加载文件总是比较慢,但是20分钟加载一个60MiB文件似乎太慢了。Python使用了一个完整的<a href="https://en.wikipedia.org/wiki/LL_parser" rel="nofollow noreferrer">lexer/parser</a>,并做了一些事情,比如跟踪源位置以获得准确的错误报告等。语法是<a href="https://stackoverflow.com/q/53596580/1358308">deliberately simple</a>,这使得解析速度相对较快,但仍然比其他文件格式慢得多。你知道吗</p>
<p>我同意另一个建议,但我认为比较不同文件格式的计时会很有趣</p>
<p>首先我生成一些数据:</p>
<pre><code>somename = [list(range(6)) for _ in range(100_000)]
</code></pre>
<p>这需要我的计算机152毫秒才能完成,然后我可以将其保存在“Python源文件”中:</p>
<pre><code>with open('data.py', 'w') as fd:
fd.write(f'somename = {somename}')
</code></pre>
<p>需要84.1毫秒,重新加载时使用:</p>
<pre><code>from data import somename
</code></pre>
<p>这需要1.40秒-我尝试了一些其他大小和缩放似乎线性阵列长度,我发现令人印象深刻。然后我开始使用不同的文件格式,JSON:</p>
<pre><code>import json
with open('data.json', 'w') as fd:
json.dump(somename, fd)
with open('data.json') as fd:
somename = json.load(fd)
</code></pre>
<p>这里保存需要787毫秒,加载需要131毫秒。接下来,CSV:</p>
<pre><code>import csv
with open('data.csv', 'w') as fd:
out = csv.writer(fd)
out.writerows(somename)
with open('data.csv') as fd:
inp = csv.reader(fd)
somename = [[int(v) for v in row] for row in inp]
</code></pre>
<p>保存时间为114毫秒,加载时间为329毫秒(如果字符串未转换为<code>int</code>,则减少到129毫秒)。接下来,我尝试了穆斯布尔关于<code>pickle</code>的建议:</p>
<pre><code>import pickle # no need for `cPickle` in Python 3
with open('data.pck', 'wb') as fd:
pickle.dump(somename, fd)
with open('data.pck', 'rb') as fd:
somename = pickle.load(fd)
</code></pre>
<p>保存时间为49.1 ms,加载时间为128 ms</p>
<p>带回家的信息看到,在源代码中保存数据需要10倍的时间,但我不知道如何用你的电脑20分钟!你知道吗</p>