code: def rolling_median_dev(items):
      
      min_heap = []
      max_heap = []
      min_heap_sum = 0   # equal to -sum(min_heap)
      max_heap_sum = 0   # equal to sum(max_heap)
      s = iter(items)
      try:
          while True:
              # Odd
              v = six.next(s)
              min_heap_sum += v
              v = -heapq.heappushpop(min_heap, -v)
              min_heap_sum -= v
              heapq.heappush(max_heap, v)
              max_heap_sum += v
              # Ensure d >= 0 despite rounding error
              d = max(0, max_heap_sum - min_heap_sum - max_heap[0])
              yield (max_heap[0], d)
  
              # Even
              v = six.next(s)
              max_heap_sum += v
              v = heapq.heappushpop(max_heap, v)
              max_heap_sum -= v
              heapq.heappush(min_heap, -v)
              min_heap_sum += v
              d = max(0, max_heap_sum - min_heap_sum)
              yield ((max_heap[0] - min_heap[0])/2, d)
      except StopIteration:
          return
docs: Compute median(items[:j]), deviation[j]) for j in range(1, len(items))
      in O(n log n) time.
  
      deviation[j] == sum(abs(x - median(items[:j])) for x in items[:j])