Python基于多维字典中的值添加值的最佳方法
我正试图根据字典第二层中的数据,找出在多维字典中插入数据的最佳和最快的方法 我的字典看起来像这样:Python基于多维字典中的值添加值的最佳方法,python,dictionary,Python,Dictionary,我正试图根据字典第二层中的数据,找出在多维字典中插入数据的最佳和最快的方法 我的字典看起来像这样: data = {} data[12831] = {"sku" : "03921" , "online" = "" ...} 键12831是产品的ID SKU代表了它自己 此数据目录包含约40k个元素 我有一个包含所有在线SKU的数组,没有ID online = ["03921","04932",...] 到目前为止,我的做法是 循环数据字典并逐个检查字典sku是否在联机数组中 for key
data = {}
data[12831] = {"sku" : "03921" , "online" = "" ...}
键12831是产品的ID
SKU代表了它自己
此数据目录包含约40k个元素
我有一个包含所有在线SKU的数组,没有ID
online = ["03921","04932",...]
到目前为止,我的做法是
循环数据字典并逐个检查字典sku是否在联机数组中
for key in data:
if data[key]["sku"] in online:
data[key]["online"] = 1
此方法需要9秒来处理所有40k产品
有什么更好的方法吗?我相信基于
的方法可能会加快您的过程。为了验证这一点,我对您的运行时和基于pandas
的方法进行了快速分析
我尝试通过创建包含一些随机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倍(尽管实际差异在一定程度上取决于数据的大小和结构) 我相信基于pandas
的方法可能会加快您的过程。为了验证这一点,我对您的运行时和基于pandas
的方法进行了快速分析
我尝试通过创建包含一些随机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倍(尽管实际差异在一定程度上取决于数据的大小和结构) 这是我最后使用的代码
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')
这是我使用的最后一个代码
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')
我试着用熊猫,我觉得有些不对劲。ID和SKU不相关。如果SKU在ID索引中,我认为这是一个外观。索引基于ID,而不是方法2()第1行的SKU。我可能错了;)这是一个非常好的线索。我使用以下方法修复此问题:is_online=df[“sku”].isin(online)。0.44秒完成并插入数据库:)我很高兴我尝试了熊猫,我觉得有些不对劲。ID和SKU不相关。如果SKU在ID索引中,我认为这是一个外观。索引基于ID,而不是方法2()第1行的SKU。我可能错了;)这是一个非常好的线索。我使用以下方法修复此问题:is_online=df[“sku”].isin(online)。0.44秒完成并插入数据库:)我很高兴