from flask_sqlalchemy import Pagination, BaseQuery
from flask import abort

def paginate_faste(self, page=1, per_page=50, max_page=None, step=5):
    if page < 1:
        abort(404)

    if max_page and page > max_page:
        abort(404)

    items = self.limit(per_page).offset((page - 1) * per_page).all()

    if not items and page != 1:
        abort(404)

    # No need to count if we're on the first page and there are fewer
    # items than we expected.
    if page == 1 and len(items) < per_page:
        total = len(items)
    else:
        if max_page:
            total = self.order_by(None).limit(per_page * min((page + step), max_page)).count()
        else:
            total = self.order_by(None).limit(per_page * (page + step)).count()

    return Pagination(self, page, per_page, total, items)

BaseQuery.paginate_faste = paginate_faste