如何使用itertools最大限度地减少大量列表的迭代时间?

2024-09-30 08:28:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我将列表的元素my_list与:

my_combinison = itertools.product(*my_list)

所以它创建了一个2614234组合元素的列表,我想验证组合列表中的每个元素是否都是对象中的作用域

list_contries_ok = list({'cities_scope': x, 'status': 1} for x in my_combinison if City.objects.only('country_id', 'city_scope').filter(country_id=CN, city_scope=','.join(x)).prefetch_related('country_id')) 
list_contries_ko = list({'cities_scope': x, 'status': 0} for x in my_combinison if not City.objects.only('country_id', 'city_scope').filter(country_id=CN, city_scope=','.join(x)).prefetch_related('country_id'))
list_contries = list_contries_ok.append(list_contries_ko)

我的最后一个列表,我想有一个列表,迭代每个组合,并说如果它的状态1 or 0。你知道吗

在执行过程中我花了好几分钟:S 有没有其他方法可以用这么长的列表来减少时间??你知道吗


Tags: inid元素city列表formystatus
2条回答
list_countries_ok = [ x and list_countries.remove(x) for x in list_countries if x['status'] ]

现在在list_countries中,您将拥有list_countries_ko,而无需对其进行迭代。你知道吗

my_combinison上进行两次传递时,只需进行一次:

def predicate(x):
    t1 = City.objects.only('country_id', 'city_scope')
    t2 = t1.filter(country_id=CN,city_scope=','.join(x))
    return 1 if t2.prefetch_related('country_id') else 0

list_countries = [ { 'cities_scope': x, 'status': predicate(x) }
                    for x in my_combinison ]

定义predicate;关键是前两个列表之间的唯一区别是long表达式是true(将status设置为1)还是false(将status设置为0)。您可以在一个过程中创建list_countries,然后在必要时将其拆分为两个单独的列表(这应该快得多,因为您不再运行复杂的 首先查询每个项目。)

list_countries_ok = [ x for x in list_countries if x['status'] ]
list_countries_ko = [ x for x in list_countries if not x['status'] ]

相关问题 更多 >

    热门问题