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

标签 python python-3.x sockets caching ip-address

我正在编写一个 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/

相关文章:

python - 在 python 中使用公差唯一化数组/列表(相当于 uniquetol)

python - 如何以正确的方式从pycurl中抽象出来

python - 比较两个列表并在python中获取一个新列表

c - 如何精确或近似地测量接收数据包的延迟

C# Tcp 异步套接字数据读取逻辑

python - 输入 'n' 时无法打印最终语句

python-3.x - 如何进行线性拟合,其中我的变量 X 是 3d 向量?

python - 将返回的元组分配给数组的不同列

ide - 具有代码完成功能的 python IDE,包括参数对象类型推断

phpmyadmin 使用 mysqli 连接,但我的 php 使用 mysqli 出错了