怎么优化python循环性能 财富值80

2016-10-17 14:37发布

在研究 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条回答

一周热门 更多>