earnings = self.collection.find({}) #return 60k documents
----
data_dic = {'score': [], "reading_time": [] }
for earning in earnings:
data_dic['reading_time'].append(earning["reading_time"])
data_dic['score'].append(earning["score"])
----
df = pd.DataFrame()
df['reading_time'] = data_dic["reading_time"]
df['score'] = data_dic["score"]
---之间的代码需要4秒才能完成。我该如何改进这个功能?
答案 0 :(得分:4)
时间由以下部分组成:Mongodb查询时间,用于传输数据的时间,网络往返,python列表操作。您可以优化每个。
一个是减少要转移的数据量。由于您只需要reading_time
和score
,因此您只能获取它们。如果您的平均文档大小很大,这种方法非常有效。
earnings = self.collection.find({}, {'reading_time': True, 'score': True})
二。 Mongo批量传输有限数量的数据。数据包含多达60k行,传输数据需要多次。您可以调整cursor.batchSize以减少往返次数。
第三,如果可以的话,增加网络带宽。
四。您可以通过利用numpy array
来加速。它是一个类似C的数组数据结构,它比python列表更快。按索引预分配固定长度数组和assigne值。这可以在致电list.append
时避免内部调整。
count = earnings.count()
score = np.empty((count,), dtype=float)
reading_time = np.empty((count,), dtype='datetime64[us]')
for i, earning in enumerate(earnings):
score[i] = earning["score"]
reading_time[i] = earning["reading_time"]
df = pd.DataFrame()
df['reading_time'] = reading_time
df['score'] = score