小编WuT*_*hat的帖子

Python在O(1)中的字典中获取随机密钥

我需要一个支持FAST插入和删除(键,值)对的数据结构,以及"获取随机密钥",它与random.choice(dict.keys())的字典相同.我在互联网上搜索过,大多数人似乎对random.choice(dict.keys())方法感到满意,尽管它是线性时间.

我知道可以更快实现这个:

  • 我可以使用调整大小的哈希表.如果我认为密钥与插槽的比例在1和2之间,那么我可以选择随机索引,直到我遇到非空插槽.我期望只看1到2把钥匙.
  • 我可以使用AVL树在保证最坏情况O(log n)中获得这些操作,并使用rank进行扩充.

有没有简单的方法在Python中获得这个?好像应该有!

python data-structures

17
推荐指数
2
解决办法
5093
查看次数

生成器+异步/等待,异步生成

我有2个非常相关的问题.一个实际的,与我所遇到的真正问题有关,还有一个理论问题.让我从后者开始:

Q1:async/await + generator有意义吗?

一般来说,在回调或承诺中产生收益并没有多大意义.问题(以及其他问题)是在多个产量之间可能存在竞争,无法判断发电机何时结束等.

function* this_is_nonsense() {
   setTimeout(() => { yield 'a'; }, 500);
   setTimeout(() => { yield 'b'; }, 500);
   return 'c';
}
Run Code Online (Sandbox Code Playgroud)

当使用async/await时,这些问题似乎实际上已经消失了

function timeout(ns) {
   return new Promise((resolve) => setTimeout(resolve, ns));
}

async function* this_could_maybe_make_sense() {
   // now stuff is sequenced instead of racing
   await timeout(500);
   yield 'a';
   await timeout(500);
   yield 'b';
   return 'c';
}
Run Code Online (Sandbox Code Playgroud)

我假设目前没有这样的事情(如果错误请纠正我!).所以我的第一个问题是,使用async/await生成器是否存在概念性问题?如果没有,是否在任何路线图上?似乎实现需要的不仅仅是将两个功能混合在一起.

Q2:如何编写懒惰的wiki爬虫

这是我所拥有的真实代码问题的人为版本.

想象一下编写一个遍历维基百科的函数,从一些任意页面开始并反复跟随链接(无论如何 - 可以是深度优先,广度优先还是其他东西).假设我们可以异步爬行维基百科页面以获取链接页面.就像是:

async function traverseWikipedia(startLink) {
  const visited = {};
  const result = [];
  function …
Run Code Online (Sandbox Code Playgroud)

javascript generator async-await ecmascript-6 ecmascript-next

5
推荐指数
0
解决办法
694
查看次数