Python提高d的导入时间

2024-09-29 01:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含以下内容的数据文件:

somename = [ [1,2,3,4,5,6],...plus other such elements making a 60 MB file called somefile.py ]

在我的python脚本(与数据在同一个文件夹中)中,我有(只有这个和适当的shebang):

from somefile import somename

这花了将近20分钟才完成。如何改进这种进口?你知道吗

我在macosx10.13上使用python3.7。你知道吗


Tags: 数据py脚本文件夹数据文件plusmbelements
2条回答

作为“Python源代码”加载文件总是比较慢,但是20分钟加载一个60MiB文件似乎太慢了。Python使用了一个完整的lexer/parser,并做了一些事情,比如跟踪源位置以获得准确的错误报告等。语法是deliberately simple,这使得解析速度相对较快,但仍然比其他文件格式慢得多。你知道吗

我同意另一个建议,但我认为比较不同文件格式的计时会很有趣

首先我生成一些数据:

somename = [list(range(6)) for _ in range(100_000)]

这需要我的计算机152毫秒才能完成,然后我可以将其保存在“Python源文件”中:

with open('data.py', 'w') as fd:
    fd.write(f'somename = {somename}')

需要84.1毫秒,重新加载时使用:

from data import somename

这需要1.40秒-我尝试了一些其他大小和缩放似乎线性阵列长度,我发现令人印象深刻。然后我开始使用不同的文件格式,JSON:

import json

with open('data.json', 'w') as fd:
    json.dump(somename, fd)

with open('data.json') as fd:
    somename = json.load(fd)

这里保存需要787毫秒,加载需要131毫秒。接下来,CSV:

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]

保存时间为114毫秒,加载时间为329毫秒(如果字符串未转换为int,则减少到129毫秒)。接下来,我尝试了穆斯布尔关于pickle的建议:

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)

保存时间为49.1 ms,加载时间为128 ms

带回家的信息看到,在源代码中保存数据需要10倍的时间,但我不知道如何用你的电脑20分钟!你知道吗

那个somename.py公司文件显然是由某个软件创建的。如果定期重新创建(即经常更改),那么其他软件应该以这样的方式重写,以创建更容易在Python中导入的数据(例如表格文本数据、JSON、yaml等等)。如果是从不更改的静态数据,请执行以下操作:

import cPickle
from somefile import somename

fh = open("data.pck", "wb")
cPickle.dump(somename, fh)
fh.close()

这将把你的数据序列化成一个文件“数据.pck“它可以很快重新加载。你知道吗

相关问题 更多 >