如何优化这个python代码?我需要改进它的运行时间

如何优化这个python代码?我需要改进它的运行时间,python,performance,optimization,execution-time,Python,Performance,Optimization,Execution Time,我想优化这个过滤函数。它在两个列表中搜索:一个是类别列表,另一个是标签列表。这就是为什么运行此函数需要很长时间的原因 def get_percentage(l1, l2, sim_score): diff = intersection(l1, l2) size = len(l1) if size != 0: perc = (diff/size) if perc >= sim_score: return

我想优化这个过滤函数。它在两个列表中搜索:一个是类别列表,另一个是标签列表。这就是为什么运行此函数需要很长时间的原因

def get_percentage(l1, l2, sim_score):
    diff = intersection(l1, l2)
    size = len(l1)
    if size != 0:
        perc = (diff/size)
        if perc >= sim_score:
                return True
    else:
        return False

def intersection(lst1, lst2):
    return len(list(set(lst1) & set(lst2)))

def filter_entities(country, city, category, entities, entityId):
    valid_entities = []
    tags = get_tags(entities, entityId)
    for index, i in entities.iterrows():
        if i["country"] == country and i["city"] == city:
            for j in i.categories:
                if j == category:
                    if(get_percentage(i["tags"], tags, 0.80)):
                        valid_entities.append(i.entity_id)

    return valid_entities

对于循环和检查,您有两个不必要的
,如果
检查,您可以删除它们,并且您肯定应该利用它们从数据帧中选择元素(假设
实体
是一个数据帧):

很难说这会有帮助,因为我们无法真正运行您提供的代码,但这应该可以消除一些低效,并利用Pandas中的一些优化

根据您的数据结构(即,如果您在上面的
实体
中有多个匹配项),您可能需要对上面的最后三行执行类似操作:

for ent in entity:
    if category in ent.categories and get_percentage(ent.tags, tags, 0.8):
        valid_entities.append(ent.entity_id)
return valid_entities

第一步是看看Engineero的答案,它修复了不必要的if和for循环。接下来,我建议您使用大量的输入数据,如果需要花费大量的时间,则应该如此。您可能希望使用numpy数组来存储数据,而不是列表,因为它更适合于存储大量数据。Numpy甚至击败了熊猫数据帧。经过一段时间后,您应该问问自己,效率是否比使用Pandas的便利性更重要,如果是这样,那么对于大量数据,Numpy将更快。

检查或改进工作代码的请求更适合使用,而不是堆栈溢出。有关差异的详细讨论,请参阅。实际上,categories是数据帧列中的一个列表,我必须在其中匹配,如果其中一个值匹配,那么我将包括该值entity@HammadKhan罗杰,我根据我认为我理解的您的数据结构对其进行了更新……感谢您,现在它的性能更好了:)
for ent in entity:
    if category in ent.categories and get_percentage(ent.tags, tags, 0.8):
        valid_entities.append(ent.entity_id)
return valid_entities