gpt4 book ai didi

python - 创建缓存以更快地访问python中的字典列表

转载 作者:行者123 更新时间:2023-12-03 11:59:12 24 4
gpt4 key购买 nike

我正在编写一个 python 程序,用于使用套接字模块获取网站的 IP 地址。
在这里,我有一个包含 n 个网站和数字的字典列表。

以下是一些示例数据:

data_list = [{'website': 'www.google.com', 'n': 'n1'}, {'website': 'www.yahoo.com', 'n': 'n2'}, {'website': 'www.bing.com', 'n': 'n3'}, {'website': 'www.stackoverflow.com', 'n': 'n4'}, {'website': 'www.smackcoders.com', 'n': 'n5'}, {'website': 'www.zoho.com', 'n': 'n6'}, {'website': 'www.quora.com', 'n': 'n7'}, {'website': 'www.elastic.co', 'n': 'n8'}, {'website': 'www.google.com', 'n': 'n9'}, {'website': 'www.yahoo.com', 'n': 'n10'}, {'website': 'www.bing.com', 'n': 'n11'}, {'website': 'www.stackoverflow.com', 'n': 'n12'}, {'website': 'www.smackcoders.com', 'n': 'n13'}, {'website': 'www.zoho.com', 'n': 'n14'}, {'website': 'www.quora.com', 'n': 'n15'}, {'website': 'www.elastic.co', 'n': 'n16'}, {'website': 'www.google.com', 'n': 'n17'}, {'website': 'www.yahoo.com', 'n': 'n18'}, {'website': 'www.bing.com', 'n': 'n19'}, {'website': 'www.stackoverflow.com', 'n': 'n20'}]

这是我的程序:
import socket
import time


data_list = [{'website': 'www.google.com', 'n': 'n1'}, {'website': 'www.yahoo.com', 'n': 'n2'}, {'website': 'www.bing.com', 'n': 'n3'}, {'website': 'www.stackoverflow.com', 'n': 'n4'}, {'website': 'www.smackcoders.com', 'n': 'n5'}, {'website': 'www.zoho.com', 'n': 'n6'}, {'website': 'www.quora.com', 'n': 'n7'}, {'website': 'www.elastic.co', 'n': 'n8'}, {'website': 'www.google.com', 'n': 'n9'}, {'website': 'www.yahoo.com', 'n': 'n10'}, {'website': 'www.bing.com', 'n': 'n11'}, {'website': 'www.stackoverflow.com', 'n': 'n12'}, {'website': 'www.smackcoders.com', 'n': 'n13'}, {'website': 'www.zoho.com', 'n': 'n14'}, {'website': 'www.quora.com', 'n': 'n15'}, {'website': 'www.elastic.co', 'n': 'n16'}, {'website': 'www.google.com', 'n': 'n17'}, {'website': 'www.yahoo.com', 'n': 'n18'}, {'website': 'www.bing.com', 'n': 'n19'}, {'website': 'www.stackoverflow.com', 'n': 'n20'}]

field = "website"
action = "append"
max_retry = 1
hit_cache_size = 10
cache = []
d1 = []

for data in data_list:
temp={}
for item in data:
if item ==field:
if data[item]!="Not available":
try:
ad=socket.gethostbyname(data[item])
if len(cache)<hit_cache_size:
cache.append({data[item]:ad})
else:
cache=[]
if action=="replace":
temp[item]=ad
elif action=="append":
temp[item]=str([data[item],ad])
except:
count=0
while(True):
try:
ad=socket.gethostbyname(data[item])
except:
count+=1
if count==max_retry:
if action=="replace":
temp[item]="Unknown"
elif action=="append":
temp[item]=str([data[item],"Unknown"])
break
else:
continue
else:
temp[item]="Not available"
else:
temp[item]=data[item]
temp['timestamp']=time.ctime()
d1.append(temp)
print(d1)

在这里, d可以拥有数百万个网站。因此,我的代码需要更多时间。所以我创建了一个缓存来存储一些 websites与他们的 ip那里。缓存大小在 hit_cache_size中定义.如果列表中出现相同的网站地址,则应先检查缓存,而不是使用套接字模块进行检查。如果网站地址在那里,它应该从那里获取 ip 并保存。我通过创建数组尝试了一些方法。尽管这需要一些时间。如何让它成为可能......

最佳答案

一般来说,缓存应该是比数组更快的数据结构。在最坏的情况下,数组的迭代次数总是与它的条目一样多(n)看看https://wiki.python.org/moin/TimeComplexity .

例如:如果您查找 'c' 的映射这里需要 3 次迭代。

entries = [('a', 1), ('b', 2), ('c', 3)]
result = None
for key, val in entries:
if key == 'c':
result = val
print(result)

如果您想加快对缓存的访问速度,请使用 python dict .这将为您提供更快的访问速度。通常这会给你一个 n log n 的平均情况。在运行时这要好得多。很好的副作用:也更好阅读。

entries = {'a': 1, 'b': 2, 'c': 3}
result = entries['c']

关于python - 创建缓存以更快地访问python中的字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55824483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com