怎么优化python循环性能

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

阅读 2.9k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进