我正在通过从输入文件中提取特征来创建稀疏矩阵文件。输入文件在每行中包含一个电影ID,然后是一些功能ID,并且具有得分。
6729792 4:0.15568 8:0.198796 9:0.279261 13:0.17829 24:0.379707
第一个数字是电影的ID,然后冒号左边的值是要素ID,右边的值是该要素的得分。
每行代表一部电影,feature:score
对的数量因电影而异。
这是我如何构造我的稀疏矩阵。
import sys
import os
import os.path
import time
import numpy as np
from Film import Film
import scipy
from scipy.sparse import coo_matrix, csr_matrix, rand
def sparseCreate(self, Debug):
a = rand(self.total_rows, self.total_columns, format='csr')
l, m = a.shape[0], a.shape[1]
f = tb.open_file("sparseFile.h5", 'w')
filters = tb.Filters(complevel=5, complib='blosc')
data_matrix = f.create_carray(f.root, 'data', tb.Float32Atom(), shape=(l, m), filters=filters)
index_film = 0
input_data = open('input_file.txt', 'r')
for line in input_data:
my_line = np.array(line.split())
id_film = my_line[0]
my_line = np.core.defchararray.split(my_line[1:], ":")
self.data_matrix_search_normal[str(id_film)] = index_film
self.data_matrix_search_reverse[index_film] = str(id_film)
for element in my_line:
if int(element[0]) in self.selected_features:
column = self.index_selected_feature[str(element[0])]
data_matrix[index_film, column] = float(element[1])
index_film += 1
self.selected_matrix = data_matrix
json.dump(self.data_matrix_search_reverse,
open(os.path.join(self.output_path, "data_matrix_search_reverse.json"), 'wb'),
sort_keys=True, indent=4)
my_films = Film(
self.selected_matrix, self.data_matrix_search_reverse, self.path_doc, self.output_path)
x_matrix_unique = self.selected_matrix[:, :]
r_matrix_unique = np.asarray(x_matrix_unique)
f.close()
return my_films
我觉得这个函数在大数据集上太慢了,计算时间太长。
如何改善和加速它?也许使用MapReduce?这个函数有什么问题导致它太慢?
答案 0 :(得分:0)
IO +转换(从str到str,甚至2次到相同var的str等)+ split + explicit循环。顺便说一句,有一个CSV python模块可用于解析你的输入文件,你可以试验它(我想你用空格作为分隔符)。此外,我'看到你将element[0]
转换为int / str,这是不好的 - 你创建了许多tmp。宾语。如果多次调用此函数,可能会尝试重用一些内部对象(数组?)。此外,您可以尝试以另一种方式实现它:使用地图或列表理解,但需要实验...
Python代码优化的一般概念是避免显式的Python字节码执行,并且更喜欢本机/ C Python函数(对于任何事情)。并确保尝试解决这么多转换。此外,如果输入文件是您的,您可以将其格式化为固定长度的字段 - 这有助于您完全避免拆分/解析(仅字符串索引)。