优化Python Pandas代码

时间:2017-01-25 14:03:47

标签: python pandas similarity

Scorelife_disct={'scorelife41': ['c', 'hindi', 'sql', 'scala', 'love'],
 'scorelife42': ['c', 'sql', 'english', 'Cat', 'html', 'cPlus', 'love'],
 'scorelife43': ['c', 'Cat', 'friend', 'love']}

User_life_disct ={'scorelifeLife1': ['c', 'hindi', 'python', 'scala', 'graphics'],
 'scorelifeLife10': ['c', 'hindi', 'perl'],
 'scorelifeLife11': ['hindi', 'perl', 'spark']}

import collections
d = collections.defaultdict(dict)

from __future__ import division
for userid in Scorelife_disct:
    #print userid
    for life_disct in User_life_disct:

        u1= Scorelife_disct[userid]
        u2= User_life_disct[life_disct]
        k1=len(set(u1)&set(u2))/len(set(u1)|set(u2))
        #print life_disct
        #print k1

        d[userid][life_disct] = k1
        print d
dict(d)

输出:

{' scorelife41': {' scorelifeLife1': 0.42857142857142855,
  ' scorelifeLife10': 0.3333333333333333,
  ' scorelifeLife11': 0.14285714285714285 }}

我使用两个python字典,每个字典列表之间的Jaccard相似性,但我的程序花费了太多时间来处理大量数据。如何减少时间复杂度问题(尽管输出正确),以便它可以在不花费太多时间的情况下工作?

1 个答案:

答案 0 :(得分:0)

您可以使用内置的分析器来查看代码瓶颈的位置:How can you profile a python script?

考虑到问题中的片段,我能看到的唯一即时加速是你运行的set()比你需要的更多:

    for userid in Scorelife_disct:
    #print userid
    for life_disct in User_life_disct:

        u1= set(Scorelife_disct[userid])
        u2= set(User_life_disct[life_disct])
        # multiply by 1.0 so that the results aren't rounded to nearest int()
        k1=len(u1&u2) * 1.0 /len(u1|u2)
        #print life_disct
        #print k1

        d[userid][life_disct] = k1
        print d

除此之外,您可能希望查看不同的数据结构来表示您的数据并针对最常见的操作进行优化。