首页   注册   登录
 dongyx 最近的时间轴更新

dongyx

V2EX 第 62947 号会员,加入于 2014-05-18 01:13:49 +08:00
最近做了个按标签分类的程序员公众号导航,有这个需求吗?
分享创造  •  dongyx  •  2018-05-13 18:09:54 PM  •  最后回复来自 dongyx
3
Google Analytics 在国内能使用吗? 会不会不准?
问与答  •  dongyx  •  2018-10-14 13:24:40 PM  •  最后回复来自 dongyx
8
关于开源协议的疑问, 怎么定义"使用", "修改", "分发".
问与答  •  dongyx  •  2018-05-01 04:55:26 AM  •  最后回复来自 msg7086
2
用复数命名集合变量的程序员, 遇到单复同形怎么办?
问与答  •  dongyx  •  2018-04-26 17:26:29 PM  •  最后回复来自 DOLLOR
12
dongyx 最近回复了
@daozhihun 倍增确定上界好赞,送一个感谢给你
@solider245 抱歉,我以为你的需求是确定最大页码,如果你是要爬去所有页面的话,用 while 就行了,二分搜索多此一举。
@solider245 就是一般意义上我们说的二分查找,一般的程序员应该都了解的。 如果你这方面有缺失,我时间不多,只能在这里简单解释一下:假设我有一个有序的整数数组,我想要查询里面一个数的下标,我先拿数组中间的数和目标数对比,如果相等那就找到了,如果小于目标值,就说明目标值在数组的后半部分,那我就去后半部分继续二分,如果大于目标值,说明目标值在数组的前半部分,我就去前部分用同样的方法找。

这样不断地分割数组,我只需要正比于数组长度的对数的时间就能找到值,也就是 1024 长度的数组我只需要找 10 次左右。

对于你的问题,你可以把所有页面看成是一个数组,合法是 0,不合法是 1,这个数组就是[0,0,0,....,1,1,1,1]这样的形式,你要找到最右边的 0,二分搜索就可以了。二分搜索的实现是很容易出 bug 的(除非你很好地掌握了循环不变式的思想, 但是如果你不知道二分搜索,我估计你也不知道循环不变式),所以不建议自己实现。bisect 标准模块已经实现了数组的二分搜索,所以你只需要构造这么一个数组,但是你不能真的去构造数组,不然相当于每个页面都去读取了一次,所以你可以覆盖__getitem__方法,构造一个假的数组,每次读数组的第 i 个值,你去取第 i 个页面就行了。

我给的代码只是简单的 demo,要达到工业强度,还需要一些改进,比如请求失败的处理之类的,祝好运。

PS:while 的做法是每个页码都尝试去读一次,比二分搜索慢了很多,但是如果你的性能需求没有你帖子里说的那么高,那就怎么简单怎么来吧。
我给楼主写一个实现,借助 bisect 标准模块,我们连二分搜索都不用自己实现,bisect_left()会求一个升序数组的 lower_bound,所以我们只需要写一个小类,覆盖__getitem__模拟数组行为,每次取下标 i 都去读站点的第 i 页,如果页面合法就返回 0,否则返回 1,然后调用 bisect_left 就可以了。

下面的例子是二分搜索探寻 Hacker news 的新闻版 ( https://news.ycombinator.com/news?p={page}) 的最大页码。对于 Hacker News 来说,一个页面有帖子当且仅当 HTML 中含有字符串'class='title'",所以可以以这个标准来确定页面是否合法。

V2EX 的回复似乎会忽略缩进,所以我也贴一个 gist:

import requests
import bisect

def valid(resp):
return int('class="title"' in resp.text)

class PageStatus:
def __getitem__(self, page):
r = requests.get("https://news.ycombinator.com/news",
params={"p": page})

return 0 if valid(r) else 1

end = bisect.bisect_left(PageStatus(), 1, lo=1, hi=1024)

print("the page range is [1, {0})".format(end))
楼主,这个可以用二分搜索解决啊。
101 天前
回复了 holinhot 创建的主题 Python 请教个 Python sqlalchemy join 问题
1.你的写法无法查出 Price 是因为你 query 的对象仅仅是 Product,尽管你做了显式 join,但是 SQLAlchemy 只会返回 Product 的信心。

2. 正确的写法有很多种,具体要看你的 Product, Price, User 三个 model 类是怎样建立 SQLAlchemy relationships 的。

其中一种最简单的写法,不管你三个类是什么关系都能用的写法,是隐式 jcross join: session.query(Product, Price).filter(Product.id == Price.id & Price.user_group_id == 2)
楼主需要再多给点细节:

1. 2G 是怎么定义的?数据的大小是和数据结构本身有关的,不同结构消耗的空间不一样,你说的 2G,具体是怎样的 2G。

2. 查询是怎么定义的,数据是怎样的结构,需要的查询操作有哪些?比如要查哪些 field,只需要精确匹配吗?需要子串查询吗?正则吗?范围不等式查询吗?
我用过一个很取巧的方法,通过 ORM 做中介。
118 天前
回复了 spost 创建的主题 奇思妙想 按比例惩罚制度~~
我不认同楼主的观点,我想这在本质会会抹平穷富之间的生活水平差异,这可能导致我们失去赚钱的动力,最后的结果是大家都不好过。
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2052 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 14ms · UTC 00:11 · PVG 08:11 · LAX 17:11 · JFK 20:11
♥ Do have faith in what you're doing.