【问题标题】:Nested hash VS hash嵌套哈希 VS 哈希
【发布时间】:2015-12-04 11:39:26
【问题描述】:
我正在构建一个网络爬虫,我希望最大限度地减少查找已访问站点和更新已访问站点列表所花费的时间。
我想知道哪种数据结构最适合这样的列表。
-
hash of hash:给定网站将域散列到第一个散列表中,然后在二级散列表中散列 URL 的最后一部分(当然,二级散列表的数量与域映射在第一个哈希表中,即每个域都有自己的哈希表)。
pro:在第一个表和嵌套表中查找时间最快
缺点:难以实现?
-
hash:简单的哈希表对于每个url,映射表中的url。
pro:更简单的方法和实现
con:查找值的时间较慢(您必须在整个表中查找)
提前致谢!
【问题讨论】:
标签:
python
data-structures
hash
hashtable
【解决方案1】:
通常最好使用单个哈希表,因为在平均情况下查找时间是恒定的,因此一次查找优于两次查找。 Python 哈希表还专门针对处理字符串进行了优化(请参阅here)。
如果您仍想实现“哈希散列”解决方案,只需使用集合的字典。 dict 键是域,值是一组子域 URL。
seen_pages = dict()
# Adding a page
seen_pages.setdefault(domain, set()).add(subdomain)
# Check whether page was seen before
is_known = False
seen_subdomains = seen_pages.get(domain)
if seen_subdomains is not None:
is_known = subdomain in seen_subdomains
如果您真的很好奇在您的特定情况下,表的大小是否真的会减慢速度,只需实现这两个版本即可。代码的差异应该是最小的。为了进行正确的测试,请预编译一个 url 列表并使用 timeit 评估这两个实现。
无论哪种方式,我都怀疑哈希表查找时间将是您最紧迫的瓶颈。最好将优化时间花在代码的其他方面。