我试图在一天之内使用Python和Scrapy从所有国家的所有机场取消所有出发和到达.
这个着名站点(飞行雷达)使用的JSON数据库需要在一个机场的出发或到达> 100时逐页查询.我还根据查询的实际UTC计算时间戳.
我尝试使用此层次结构创建数据库:
country 1
- airport 1
- departures
- page 1
- page ...
- arrivals
- page 1
- page ...
- airport 2
- departures
- page 1
- page ...
- arrivals
- page
- page ...
...
Run Code Online (Sandbox Code Playgroud)
我使用两种方法按页面计算时间戳和网址查询:
def compute_timestamp(self):
from datetime import datetime, date
import calendar
# +/- 24 heures
d = date(2017, 4, 27)
timestamp = calendar.timegm(d.timetuple())
return timestamp
def build_api_call(self,code,page,timestamp):
return 'https://api.flightradar24.com/common/v1/airport.json?code={code}&plugin\[\]=&plugin-setting\[schedule\]\[mode\]=&plugin-setting\[schedule\]\[timestamp\]={timestamp}&page={page}&limit=100&token='.format(
code=code, page=page, timestamp=timestamp)
Run Code Online (Sandbox Code Playgroud)
我将结果存储到CountryItem包含许多AirportItem机场的结果中.我 …
我有一个类使用递归的回溯算法解决一个确切的覆盖问题.最初,我使用在初始化期间传递给对象的回调函数实现了类.无论何时找到解决方案,都会调用此回调.在查看其他人对同一问题的实现时,我看到他们使用yield语句来传递解决方案,换句话说,他们的代码是一个python生成器.我认为这是一个有趣的想法,所以我创建了我的课程的新版本以使用收益率.然后,我在两个版本之间运行了比较测试,令我惊讶的是,我发现生成器版本运行速度比回调版本慢5倍.请注意,除了切换回调的yield之外,代码是相同的.
这里发生了什么?我猜测,因为生成器需要在屈服之前保存状态信息,然后在下次调用时重新启动时恢复该状态,正是这种保存/恢复使生成器版本运行得慢得多.如果是这种情况,发电机必须保存和恢复多少状态信息?
来自python专家的任何想法?
- 编辑7:40太平洋时间
这是使用yield的求解器代码.通过调用回调函数替换下面的第一个yield,并将第二个yield更改为以下循环,只需一个递归调用来解析此代码的原始版本.
def solve(self):
for tp in self.pieces:
if self.inuse[tp.name]: continue
self.inuse[tp.name] = True
while tp.next_orientation() is not None:
if tp.insert_piece():
self.n_trials += 1
self.pieces_in += 1
self.free_cells -= tp.size
if self.pieces_in == len(self.pieces) or self.free_cells == 0:
self.solutions += 1
self.haveSolution = True
yield True
self.haveSolution = False
else:
self.table.next_base_square()
for tf in self.solve():
yield tf
tp.remove_piece()
self.pieces_in -= 1
self.table.set_base_square(tp.base_square)
self.free_cells += tp.size
self.inuse[tp.name] = False
tp.reset_orientation()
Run Code Online (Sandbox Code Playgroud)
调用求解器的邮件循环(当然是在初始化之后)是
start_time = time.time()
for tf in …Run Code Online (Sandbox Code Playgroud)