Python Эффективный способ разбора строки на список с плавающей точкой из файла - PullRequest
0 голосов
/ 23 ноября 2018

В этом документе есть слово и десятки тысяч чисел с плавающей запятой в строке, я хочу преобразовать его в словарь со словом в качестве ключа и вектором со всеми числами с плавающей запятой.Это то, что я делаю, но из-за размера файла (около 20 тыс. Строк в каждой и около 10 тыс. Значений) процесс занимает слишком много времени.Я не смог найти более эффективный способ выполнения анализа.Просто несколько альтернативных способов, которые не гарантировали сокращения времени выполнения.

with open("googlenews.word2vec.300d.txt") as g_file:
  i = 0;
  #dict of words: [lots of floats]
  google_words = {}

  for line in g_file:
    google_words[line.split()[0]] = [float(line.split()[i]) for i in range(1, len(line.split()))]

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

В вашем решении вы преформуете медленно line.split() для каждого слова, дважды.Рассмотрим следующую модификацию:

with open("googlenews.word2vec.300d.txt") as g_file:
    i = 0;
    #dict of words: [lots of floats]
    google_words = {}

    for line in g_file:
        word, *numbers = line.split()
        google_words[word] = [float(number) for number in numbers]

Одна из продвинутых концепций, которую я здесь использовал, это «распаковка»: word, *numbers = line.split()

Python позволяет распаковывать итерируемые значения в несколько переменных:

a, b, c = [1, 2, 3]
# This is practically equivalent to
a = 1
b = 2
c = 3

* - это сокращение от "взять остатки, поместить их в list и присвоить списку имя":

a, *rest = [1, 2, 3, 4]
# results in
a == 1
rest == [2, 3, 4]
0 голосов
/ 23 ноября 2018

Вы также можете использовать модуль csv , который должен быть более эффективным, чем то, что вы делаете.

Это было бы что-то вроде:

import csv

d = {}
with (open("huge_file_so_huge.txt", "r")) as g_file:
    for row in csv.reader(g_file, delimiter=" "):
        d[row[0]] = list(map(float, row[1:]))
0 голосов
/ 23 ноября 2018

Только не звоните line.split() более одного раза.

with open("googlenews.word2vec.300d.txt") as g_file:
    i = 0;
    #dict of words: [lots of floats]
    google_words = {}

    for line in g_file:
        temp = line.split()
        google_words[temp[0]] = [float(temp[i]) for i in range(1, len(temp))]

Вот простой генератор такого файла:

s = "x"
for i in range (10000):
    s += " 1.2345"
print (s)

Предыдущая версия занимает некоторое время.Версия с одним вызовом split является мгновенной.

...