在研究 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我不是很熟悉,基本行学先卖,想问问可以如何优化