python中set怎么循环_怎么优化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我不是很熟悉,基本行学先卖,想问问可以如何优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值