Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kracekumar/flask_vs_django_bench
Benchmark Flask vs Django for simple JsonResponse
https://github.com/kracekumar/flask_vs_django_bench
Last synced: about 2 months ago
JSON representation
Benchmark Flask vs Django for simple JsonResponse
- Host: GitHub
- URL: https://github.com/kracekumar/flask_vs_django_bench
- Owner: kracekumar
- Created: 2015-05-02T16:34:48.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2015-05-02T16:36:26.000Z (over 9 years ago)
- Last Synced: 2024-07-24T14:01:26.158Z (2 months ago)
- Language: Python
- Homepage: http://kracekumar.com/post/117948332935/simple-json-response-benchmark-between-flask-and
- Size: 102 KB
- Stars: 9
- Watchers: 4
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Django and Flask are two well known Python web frameworks. There are lot of benchmarks which claim Flask is 2x
faster for simple JSON Response, one such is [Techempower](https://www.techempower.com/benchmarks/). After looking
into the [source](https://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks/Python/django), it struck
me Django can do better!I will compare Flask and Django for simple json response. The machine used is Macbook pro, `Intel Core i5-4258U CPU @ 2.40GHz`,
with `8 GB` Memory on `OS X 10.10.3`. `gunicorn==19.3.0` will be used for serving WSGI application.#flask simple app
from flask import Flask, jsonifyapp = Flask(__name__)
@app.route('/index')
def index():
return jsonify({'hello': 'world'})if __name__ == "__main__":
app.run()Start the flask app, `gunicorn -w 2 -b 127.0.0.1:5000 flask_app:app`.
`apachebench` will be used for benchmarking, you can use any tool for this.
ab -n 1000 -c 2 http://localhost:5000/index
...
Server Software: gunicorn/19.3.0
Server Hostname: localhost
Server Port: 5000Document Path: /index
Document Length: 22 bytesConcurrency Level: 2
Time taken for tests: 0.622 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 174000 bytes
HTML transferred: 22000 bytes
Requests per second: 1429.55 [#/sec] (mean)
Time per request: 1.399 [ms] (mean)
Time per request: 0.700 [ms] (mean, across all concurrent requests)
Transfer rate: 242.91 [Kbytes/sec] receivedNow let's do same thing with Django 1.8 with default settings.
#hello/views.py
from django.http import JsonResponse# Create your views here.
def index(request):
return JsonResponse({'hello': 'world'})Add `url('^index/$', index),` in `urls.py` and `hello` app in `settings.py`.
Start the Django app, `gunicorn -w 2 -b 127.0.0.1:8000 django_app.wsgi`.ab -n 1000 -c 2 http://localhost:8000/index/
Server Software: gunicorn/19.3.0
Server Hostname: localhost
Server Port: 8000Document Path: /index/
Document Length: 18 bytesConcurrency Level: 2
Time taken for tests: 0.814 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 179000 bytes
HTML transferred: 18000 bytes
Requests per second: 1228.25 [#/sec] (mean)
Time per request: 1.628 [ms] (mean)
Time per request: 0.814 [ms] (mean, across all concurrent requests)
Transfer rate: 214.70 [Kbytes/sec] receivedTime taken for 1000 requests by Django is `0.814s` and Flask is `0.622s`. Clearly flask is faster.
Django is full fledged framework but Flask is micro framework. Django comes with lot of middlewares, contrib
models etc ... Remove all those unused settings in `settings.py`.Comment all `middleware classes`. The `settings` snippet looks like
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles','hello',
)MIDDLEWARE_CLASSES = (
# 'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
# 'django.contrib.messages.middleware.MessageMiddleware',
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)Restart the django app and run `ab -n 1000 -c 2 http://localhost:8000/index/`.
Server Software: gunicorn/19.3.0
Server Hostname: localhost
Server Port: 8000Document Path: /index/
Document Length: 18 bytesConcurrency Level: 2
Time taken for tests: 0.560 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 150000 bytes
HTML transferred: 18000 bytes
Requests per second: 1784.37 [#/sec] (mean)
Time per request: 1.121 [ms] (mean)
Time per request: 0.560 [ms] (mean, across all concurrent requests)
Transfer rate: 261.38 [Kbytes/sec] receivedNow Django took only `0.560s` for 1000 requests compared to flask `0.622s`.
Now remove Django admin from `urls.py`, and remove all `contrib` apps in `INSTALLED_APPS`.
INSTALLED_APPS = (
#'django.contrib.admin',
#'django.contrib.auth',
#'django.contrib.contenttypes',
#'django.contrib.sessions',
#'django.contrib.messages',
#'django.contrib.staticfiles','hello',
)Restart the Django app and run the benchmark `ab -n 1000 -c 2 http://localhost:5000/index`.
Server Software: gunicorn/19.3.0
Server Hostname: localhost
Server Port: 8000Document Path: /index/
Document Length: 18 bytesConcurrency Level: 2
Time taken for tests: 0.553 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 150000 bytes
HTML transferred: 18000 bytes
Requests per second: 1806.90 [#/sec] (mean)
Time per request: 1.107 [ms] (mean)
Time per request: 0.553 [ms] (mean, across all concurrent requests)
Transfer rate: 264.68 [Kbytes/sec] receivedThat is much better. While developing API based application in Django tweak your setting to get
better performance out of Django.