Pythonの軽量フレームワーク3種類を比較する

ここでは軽量・コンパクトをウリにしているPythonのWebアプリケーションフレームワークであるBottle、Flask、Falconについて比較します。これらのフレームワークに対して、同様のリクエストを送り、同様のレスポンスを返させます。 記事を書くにあたり使用したもののバージョンは下記の通りです。

  • Ubuntu 14.04.2
  • Python 3.4.0
  • Bottle 0.12.8
  • Flask 0.10.1
  • Falcon 0.2

準備

"/foo"にアクセスすると"Hello foo"と応答するように、各フレームワークで極力同じように書きます。FalconはCythonに公式に対応していますが、今回はCythonを使用していません。

Bottle

import bottle


app = bottle.Bottle()


@app.route('/<name>')
def index(name):
    return 'Hello {}'.format(name)

Flask

import flask


app = flask.Flask(__name__)


@app.route('/<name>')
def index(name):
    return 'Hello {}'.format(name)

Falcon

import falcon


class Index:
    def on_get(self, req, resp, name):
        resp.body = 'Hello {}'.format(name)


app = falcon.API()
app.add_route('/{name}', Index())

ベンチマーク

ポート9000番でbottle、9001番でflask、9002番でfalconを起動します。

$ uwsgi -s /tmp/bottle.sock -w hello_bottle:app --http :9000
$ uwsgi -s /tmp/flask.sock -w hello_flask:app --http :9001
$ uwsgi -s /tmp/falcon.sock -w hello_falcon:app --http :9002

ベンチマークスクリプト

各アプリケーションに対して1000回ずつを5回試しました。

from benchmarker import Benchmarker
import requests


loop = 1000

with Benchmarker(width=20) as bench:
    @bench("bootle")
    def _(bm):
        [requests.get('http://localhost:9000/world')  for _ in range(loop)]

    @bench("flask")
    def _(bm):
        [requests.get('http://localhost:9001/world')  for _ in range(loop)]

    @bench("falcon")
    def _(bm):
        [requests.get('http://localhost:9002/world')  for _ in range(loop)]

結果

値が小さいほど優れています。常にFalcon > Bottle > Flaskの順で優秀なスコアを出しています。

## benchmarker:         release 4.0.1 (for python)
## python version:      3.4.0
## python compiler:     GCC 4.8.2
## python platform:     Linux-3.16.0-31-generic-x86_64-with-Ubuntu-14.04-trusty
## python executable:   /usr/bin/python3
## cpu model:           Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz  # 2290.770 MHz
## parameters:          loop=1, cycle=1, extra=0
##                        real    (total    = user    + sys)
bootle                  2.3660    1.8000    1.6800    0.1200
flask                   2.6216    1.8000    1.6500    0.1500
falcon                  2.2160    1.7300    1.5600    0.1700

## Ranking                real
falcon                  2.2160  (100.0) ********************
bootle                  2.3660  ( 93.7) *******************
flask                   2.6216  ( 84.5) *****************

## Matrix                 real    [01]    [02]    [03]
[01] falcon             2.2160   100.0   106.8   118.3
[02] bootle             2.3660    93.7   100.0   110.8
[03] flask              2.6216    84.5    90.2   100.0
##                        real    (total    = user    + sys)
bootle                  2.4926    1.8600    1.6500    0.2100
flask                   2.8004    1.9100    1.6900    0.2200
falcon                  2.3127    1.8100    1.5800    0.2300

## Ranking                real
falcon                  2.3127  (100.0) ********************
bootle                  2.4926  ( 92.8) *******************
flask                   2.8004  ( 82.6) *****************

## Matrix                 real    [01]    [02]    [03]
[01] falcon             2.3127   100.0   107.8   121.1
[02] bootle             2.4926    92.8   100.0   112.3
[03] flask              2.8004    82.6    89.0   100.0
##                        real    (total    = user    + sys)
bootle                  2.5124    1.8800    1.7000    0.1800
flask                   2.6077    1.7700    1.5800    0.1900
falcon                  2.1731    1.7000    1.5200    0.1800

## Ranking                real
falcon                  2.1731  (100.0) ********************
bootle                  2.5124  ( 86.5) *****************
flask                   2.6077  ( 83.3) *****************

## Matrix                 real    [01]    [02]    [03]
[01] falcon             2.1731   100.0   115.6   120.0
[02] bootle             2.5124    86.5   100.0   103.8
[03] flask              2.6077    83.3    96.3   100.0
##                        real    (total    = user    + sys)
bootle                  2.4910    1.8500    1.6400    0.2100
flask                   2.9116    2.0000    1.7900    0.2100
falcon                  2.2957    1.7800    1.6300    0.1500

## Ranking                real
falcon                  2.2957  (100.0) ********************
bootle                  2.4910  ( 92.2) ******************
flask                   2.9116  ( 78.8) ****************

## Matrix                 real    [01]    [02]    [03]
[01] falcon             2.2957   100.0   108.5   126.8
[02] bootle             2.4910    92.2   100.0   116.9
[03] flask              2.9116    78.8    85.6   100.0
##                        real    (total    = user    + sys)
bootle                  2.4310    1.8200    1.6400    0.1800
flask                   2.6896    1.8500    1.6700    0.1800
falcon                  2.2298    1.7300    1.5400    0.1900

## Ranking                real
falcon                  2.2298  (100.0) ********************
bootle                  2.4310  ( 91.7) ******************
flask                   2.6896  ( 82.9) *****************

## Matrix                 real    [01]    [02]    [03]
[01] falcon             2.2298   100.0   109.0   120.6
[02] bootle             2.4310    91.7   100.0   110.6
[03] flask              2.6896    82.9    90.4   100.0
結果のグラフ

しかしながら、圧倒的な差にはなっておらず、ビジネスロジックを書けば書くほど相対的な差は縮まっていきますので、サポートされている機能など、フレームワークの機能で比較するほうが重要と感じました。

コメント

2015 - 2017 (c) 成瀬基樹