相关疑难解决方法(0)

Yield Request调用在scrapy的递归方法中产生奇怪的结果

我试图在一天之内使用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机场的结果中.我 …

python recursion yield scrapy web-scraping

15
推荐指数
2
解决办法
1544
查看次数

Python生成器与回调函数

我有一个类使用递归的回溯算法解决一个确切的覆盖问题.最初,我使用在初始化期间传递给对象的回调函数实现了类.无论何时找到解决方案,都会调用此回调.在查看其他人对同一问题的实现时,我看到他们使用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)

python profiling generator

6
推荐指数
1
解决办法
1957
查看次数

标签 统计

python ×2

generator ×1

profiling ×1

recursion ×1

scrapy ×1

web-scraping ×1

yield ×1