Слишком долго добавление с помощью append в двойном цикле, как сделать если очень много значений добавлять быстрее значения
def search(request):
sort = request.GET.get('sort')
manuf = request.GET.get('manuf')
group = request.GET.get('group')
art = request.GET.get('art')
brend = request.GET.get('brend')
#кроссировка для api python
if request.GET:
# categories = Category.objects.filter(published=True).select_related('parent').prefetch_related('children')
form = SearchForm(request.GET)
query = request.GET.get('q', '').lower()
query = query.replace("/", '')
cart_product_form = CartAddProductForm()
response = requests.get(
url='https://fapi.iisis.ru/fapi/v2/productList?n='+query+'&ui=')
if request.user.is_authenticated and response.status_code == 200: # если кроссировка подключена
part_name = response.json()["productList"]['p']
mf_name1 = response.json()["manufacturerList"]['mf']
part_d = [page for page in response.json()["productList"]['p']]
part_ns = [page['ns'] for page in response.json()["productList"]['p']]
mf_name = [page for page in response.json()["manufacturerList"]['mf']]
part_nam_s = [page['d'] for page in response.json()["productList"]['p']]
else: # если нет
part_name = None
part_ns = None
mf_name = None
s = SphinxClient()
s.SetServer('localhost', 9312)
#s.SetSortMode(SPH_SORT_RELEVANCE)
s.SetLimits(0, 16777215)
if request.user.is_authenticated and art and brend:
response2 = requests.get(
url='https://fapi.iisis.ru/fapi/v2/analogList?n=' + query + '&art={{art}}&brend={{brend}}&ui=')
part_nsa = [page['nsa'] for page in response2.json()["analogList"]['a']]
part_ns = [page['ns'] for page in response2.json()["analogList"]['a']]
part_ns2 = [page for page in response2.json()["analogList"]['a']]
art_ns2 = [page['mfai'] for page in response2.json()["analogList"]['a']]
mf_brend = [page['ds'] for page in response2.json()["manufacturerList"]['mf']]
mf_brend2 = [page for page in response2.json()["manufacturerList"]['mf']]
pages_id = []
pages_id1 = []
query1 = art+' '+brend
query_results2 = s.Query(query1, 'dars1')
pages_id1.extend(pr['id'] for pr in query_results2['matches'])
products2 = Product.objects.filter(id_p__in=pages_id1,
published=True).select_related('brand', 'category',
'product_sklad').prefetch_related(
'brand__clt1__client_id', 'category__parent')
for person in response2.json()["analogList"]['a']:
query2 = response2.json()["manufacturerList"]['mf'][person['mfai']]['ds']+' '+person['nsa']
query_results = s.Query(query2, 'dars2')
pages_id.extend(pr['id'] for pr in query_results['matches'])
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Вы можете сократить количество .append следующим образом:
pages_id = []
pages_id1 = []
query1 = art+' '+brend
for person in response2.json()["analogList"]['a']:
query2 = response2.json()["manufacturerList"]['mf'][person['mfai']]['ds']+' '+person['nsa']
query_results = s.Query(query2, 'dars2')
query_results2 = s.Query(query1, 'dars1')
pages_id.extend(pr['id'] for pr in query_results['matches'])
pages_id1.extend(pr['id'] for pr in query_results2['matches'])
Но это не поможет. Мой опыт говорит что львиную долю времени занимают вызовы s.Query(...). Особенно подозрителен s.Query(query1, 'dars1'), который повторяется много раз с одними и теми же параметрами. Вынесите его из цикла.