Я ищу способ ускорить загрузку файла следующим образом:
Данные содержат около 1 миллиона строк, табуляция разделена символом "\t" (символ табуляции) и кодировка utf8, для анализа полного файла с приведенным ниже кодом требуется около 9 секунд. Тем не менее, я хотел бы быть почти в порядке секунды!
def load(filename):
features = []
with codecs.open(filename, 'rb', 'utf-8') as f:
previous = ""
for n, s in enumerate(f):
splitted = tuple(s.rstrip().split("\t"))
if len(splitted) != 2:
sys.exit("wrong format!")
if previous >= splitted:
sys.exit("unordered feature")
previous = splitted
features.append(splitted)
return features
Мне интересно, могут ли какие-либо данные двоичного формата что-то ускорить? Или, если бы я мог воспользоваться некоторыми NumPy
или любыми другими библиотеками, чтобы иметь более высокую скорость загрузки.
Может быть, вы могли бы дать мне совет по поводу другого узкого места в скорости?
РЕДАКТИРОВАТЬ: попробую некоторые из ваших идей, спасибо! Кстати, мне действительно нужен кортеж (строка, строка) внутри огромного списка... вот результаты, я получаю 50% времени :) теперь я собираюсь позаботиться о двоичных данных NumPy, как я заметил что еще один огромный файл действительно очень быстро загружался...
import codecs
def load0(filename):
with codecs.open(filename, 'rb', 'utf-8') as f:
return f.readlines()
def load1(filename):
with codecs.open(filename, 'rb', 'utf-8') as f:
return [tuple(x.rstrip().split("\t")) for x in f.readlines()]
def load3(filename):
features = []
with codecs.open(filename, 'rb', 'utf-8') as f:
for n, s in enumerate(f):
splitted = tuple(s.rstrip().split("\t"))
features.append(splitted)
return features
def load4(filename):
with codecs.open(filename, 'rb', 'utf-8') as f:
for s in f:
yield tuple(s.rstrip().split("\t"))
a = datetime.datetime.now()
r0 = load0(myfile)
b = datetime.datetime.now()
print "f.readlines(): %s" % (b-a)
a = datetime.datetime.now()
r1 = load1(myfile)
b = datetime.datetime.now()
print """[tuple(x.rstrip().split("\\t")) for x in f.readlines()]: %s""" % (b-a)
a = datetime.datetime.now()
r3 = load3(myfile)
b = datetime.datetime.now()
print """load3: %s""" % (b-a)
if r1 == r3: print "OK: speeded and similars!"
a = datetime.datetime.now()
r4 = [x for x in load4(myfile)]
b = datetime.datetime.now()
print """load4: %s""" % (b-a)
if r4 == r3: print "OK: speeded and similars!"
Результаты :
f.readlines(): 0:00:00.208000
[tuple(x.rstrip().split("\t")) for x in f.readlines()]: 0:00:02.310000
load3: 0:00:07.883000
OK: speeded and similars!
load4: 0:00:07.943000
OK: speeded and similars!
что-то очень странное в том, что я замечаю, что у меня может быть почти удвоенное время в двух последовательных запусках (но не каждый раз):
>>> ================================ RESTART ================================
>>>
f.readlines(): 0:00:00.220000
[tuple(x.rstrip().split("\t")) for x in f.readlines()]: 0:00:02.479000
load3: 0:00:08.288000
OK: speeded and similars!
>>> ================================ RESTART ================================
>>>
f.readlines(): 0:00:00.279000
[tuple(x.rstrip().split("\t")) for x in f.readlines()]: 0:00:04.983000
load3: 0:00:10.404000
OK: speeded and similars!
ПОСЛЕДНЯЯ РЕДАКТИРОВАТЬ: ну, я попытался изменить, чтобы использовать numpy.load
... это очень странно для меня... из "обычного" файла с моими 1022860 строками и 10 КБ. После выполнения numpy.save(numpy.array(load1(myfile)))
я получил 895 МБ! а затем перезагружая это с помощью numpy.load()
, я получаю такое время при последовательных запусках:
>>> ================================ RESTART ================================
loading: 0:00:11.422000 done.
>>> ================================ RESTART ================================
loading: 0:00:00.759000 done.
может быть, numpy делает некоторые вещи с памятью, чтобы избежать перезагрузки в будущем?
previous
иsplitted
именно так? Вы изучали понимание списка? Например, см. этот связанный пост SO а>. - person Tim   schedule 03.09.2012