如何优化此python代码?我需要改善其运行时间

时间:2018-07-26 14:48:46

标签: 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 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

2 个答案:

答案 0 :(得分:1)

您有几个不必要的AccountHead循环和class AccountHead extends Model { use SoftDeletes; use Updater; protected $table = 'account_heads'; protected $fillable = [ 'name', 'code', 'memo', 'opening_balance', 'parent_id', 'status', 'created_by', 'updated_by', 'deleted_by' ]; public function parent() { return $this->belongsTo('App\Model\AccountHead','parent_id')->where('parent_id',0)->with('parent'); } public function children() { return $this->hasMany('App\Model\AccountHead','parent_id')->with('children'); } } 在那里可以删除的检查,并且您绝对应该利用df.loc从数据框中选择元素(假设{ {1}} 是熊猫数据框):

for

很难确定这会有所帮助,因为我们无法真正运行您提供的代码,但这应该可以消除一些效率低下的问题,并可以利用Pandas提供的一些优化功能。

根据您的数据结构(例如,如果您在上面的if中有多个匹配项),则可能需要对上面的最后三行执行以下操作:

entities

答案 1 :(得分:1)

第一步是查看Engineero的答案,该答案解决了不必要的if和for循环。接下来,我建议您是否使用大量的输入数据,如果花费大量时间,应该是这种情况。您可能要使用numpy数组存储数据而不是列表,因为它对于大量数据as seen here更好。 Numpy甚至击败了Pandas DataFrames as seen here。在某一点之后,您应该问自己:使用效率是否比使用Pandas的便利性更重要,如果是这样,对于大量数据,Numpy会更快。