在研究 apriori算法。看了很多别人的代码,但是发现实际跑的时候,如果数据量一大,性能很差,
我的一个文件有15万多条销售记录(仅一个月),包含8381个单品,12599个有效订单(每个订单包含数个商品)。
性能问题 发生在如下代码
def returnItemsWithMinSupport(itemSet,transactionList,minSupport,freqSet): _itemSet = set() localSet = defaultdict(int) total_size = len(transactionList) for item in itemSet: #itemSet里存的是所有的产生交易的条码 for transaction in transactionList: #transactonList里存的是所有交易订单 if item.issubset(transaction): #如果条码包含在订单中 freqSet[item] += 1 #条码计数+1 localSet[item] +=1 for item,count in localSet.items(): support = float(count)/total_size if support>= minSupport: _itemSet.add(item) return _itemSet
因该说代码还是很简单的,问题是循环次数太多了,外层循环要8千多次,内层循环第次要1.2万多次,两个一起就不得了了,能过性能分析,时间都浪费在这里了
ncalls tottime percall cumtime percall filename:lineno(function) 2 19.543 9.771 31.522 15.761 apriori.py:14(returnItemsWithMinSupport) Line # Hits Time Per Hit % Time Line Contents ============================================================== 13 @profile 14 def returnItemsWithMinSupport(itemSet,transactionList,minSupport,freqSet): 15 2 7 3.5 0.0 _itemSet = set() 16 2 4 2.0 0.0 localSet = defaultdict(int) 17 18 8384 17224 2.1 0.0 for item in itemSet: 19 105613200 63988857 0.6 44.8 for transaction in transactionList: 20 105604818 78647471 0.7 55.1 if item.issubset(transaction): 21 44467 112205 2.5 0.1 freqSet[item] += 1 22 44467 44992 1.0 0.0 localSet[item] +=1 23 24 8384 14347 1.7 0.0 for item,count in localSet.items(): 25 8382 8374 1.0 0.0 support = float(count)/len(transactionList) 26 27 8382 5954 0.7 0.0 if support>= minSupport: 28 2 8 4.0 0.0 _itemSet.add(item) 29 30 2 3 1.5 0.0 return _itemSet
下面是
python我不是很熟悉,基本行学先卖,想问问可以如何优化
付费偷看金额在0.1-10元之间
一周热门 更多>