Python лучших способов добавить значение на основе значения в многомерном словаре - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь найти лучший и быстрый способ вставить данные в многомерный словарь на основе данных во втором слое словаря.

Мой словарь выглядит примерно так:

data = {}
data[12831] = {"sku" : "03921" , "online" = "" ...}

Ключ 12831 является идентификатором продукта. Артикул говорит сам за себя. Эти данные диктуют. содержит около 40 тыс. элементов.

У меня есть массив, содержащий все онлайновые SKU без идентификатора

online = ["03921","04932",...]

Пока что я бы использовал L oop словарь данных и проверил один из них. один, если словарь sku находится в массиве ONLINE

for key in data:
  if data[key]["sku"] in online:
    data[key]["online"] = 1

Этот метод занимает 9 секунд для обработки всех продуктов 40 000.

Любая идея для лучшего способа сделать это.

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вот последний код, который я использую.

import pandas as pd


online = ["000123","000321",...]

data = {}
data[60011] = {"id":60011, "sku":"000123", "online" : "0"}
data[60012] = {"id":60012, "sku":"000122", "online" : "0"}
data[60013] = {"id":60013, "sku":"000321", "online" : "0"}
...

df = pd.DataFrame.from_dict(data, orient='index')

is_online = df["sku"].isin(online)
df.loc[is_online,'online']='1'

#return to Dictionary
final = df.to_dict('index')
1 голос
/ 26 апреля 2020

Я полагаю, что основанное на pandas appraoch может ускорить ваш процесс. Чтобы проверить это, я сделал быстрый анализ времени выполнения вашего и pandas подхода.

Я попытался воспроизвести вашу настройку, создав data и online, которые содержат некоторые случайные SKU и ключи.

from random import randint, seed

seed(42)

data = {}
for i in range(40000):
    data[i]={"sku":randint(0,100000), "online":""}

online = [randint(0,100000) for _ in range(1000)]

Я рассчитал ваш подход, используя timeit:

def approach1():
    for key in data:
        if data[key]["sku"] in online:
            data[key]["online"] = 1

print(timeit(approach1(), number=10))
>>>> 4.411111836

И я сделал то же самое для подхода pandas:

df = pd.DataFrame.from_dict(data, orient='index')

def approach2():
    in_online = df.index.isin(online)
    df.loc[in_online,'online']='1'

print(timeit(approach2, number=10))
>>>> 0.020047925999999938

Как Как видите, подход pandas примерно в 220 раз быстрее, чем другой (хотя реальная разница немного зависит от размера и структуры ваших данных).

...