[PYTHON] Flask + PyPy J'ai pris un benchmark de vitesse avec Blueprint pour le Web à grande échelle

J'ai comparé Django, Flask et Pyramid dans Article précédent, et j'ai trouvé Flask bon, donc je l'ai essayé immédiatement.

Nous évaluons et comparons les fonctionnalités construites selon le Blueprint Tutorial, qui est censé être à grande échelle dans le framework Web Python appelé Flask. Blueprint est une fonction Flask qui sépare les vues en plusieurs petites applications (chaque fonction).

Après la construction, j'ai utilisé Apache Bench pour obtenir un ** benchmark ** comparant PyPy3 2.4 et Python 3.5.

Structure du répertoire

Contrairement à la vue unique par défaut, un répertoire de vues est configuré et les vues pour chaque fonction sont configurées dans ce répertoire. Cette fois, j'ai ajouté les fonctions root et report.

■ Structure du répertoire スクリーンショット 2015-12-11 16.36.56.png

Abstraction de modèle

Séparez les parties communes telles que les balises HTML HEAD et BODY en les séparant de master.html.

master.html


<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset="utf-8" />
  <title>{% block title %}{% endblock %} - Hello Flask!</title>
  <link type="text/css" rel="stylesheet"
       href="{{ url_for('static',
                        filename='hello.css')}}" />
</head>
<body>

{% block body %}{% endblock %}

</body>
</html>

index.html


{% extends "master.html" %}

{% block title %}index{% endblock %}

{% block body %}
<h1>this is index page</h1><br />

<h3>report</h3>
<a href="{{ url_for('report.index') }}">report - index</a><br />
<a href="{{ url_for('report.report_list') }}">report - list</a><br />
{% endblock %}

■ Résultat de la représentation de index.html スクリーンショット 2015-12-11 16.41.33.png

Abstraction d'URL et définition de la première page

Le serveur Flask est démarré avec la commande python main.py. Associez l'URL de chaque fonction à main.py.

main.py


# -*- coding: utf-8 -*-
from flask import Flask
from views import root, report


app = Flask(__name__)
#Définir l'URL pour chaque fonction
app.register_blueprint(root.app, url_prefix="/")
app.register_blueprint(report.app, url_prefix="/report")


if __name__ == '__main__':
    app.run(debug=True)

Définition de la fonction racine

Définissez la première page du site.

root.py


# -*- coding: utf-8 -*-
from flask import render_template, Blueprint

#Le nom du premier argument est l'url du modèle_Lié au nom lors de l'appel pour
app = Blueprint("index",
                __name__,
                url_prefix='/<user_url_slug>')

#Url lors de l'appel d'un modèle_for('index.index')
@app.route("/")
def index():
    return render_template('root/index.html')

définition de la fonction de rapport

report.py


# -*- coding: utf-8 -*-
from flask import Module, render_template, Blueprint

app = Blueprint('report',
                __name__,
                url_prefix='/<user_url_slug>')


#Url lors de l'appel d'un modèle_for('report.index')
@app.route('/', methods=['GET'], strict_slashes=False)
def index():
    return 'report index'


#Url lors de l'appel d'un modèle_for('report.report_list')
@app.route('/report_list', methods=['GET'], strict_slashes=False)
def report_list():
    return 'report - list'

Benching avec PyPy3 2.4 et Python 3.5

J'ai défini debug = False et j'ai essayé de demander 10000 fois avec 100 parallélisme avec la commande Apache Bench. Python 3.5 a été 26% plus rapide. Le serveur a été démarré par la commande python main.py, il s'agit donc d'un benchmark de processus unique. Je m'attendais à ce que PyPy soit extrêmement rapide, mais lorsque j'ai ouvert le couvercle, je me suis retrouvé avec un résultat mystérieux que Python 3.5 était plus rapide. flask est «Flask == 0.10.1». Ensuite, je voudrais enquêter sur l'accès à la base de données.

スクリーンショット 2015-12-11 17.20.24.png

Résultats du banc PyPy3


>>>ab -n 10000 -c 100 http://localhost:5000/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Werkzeug/0.11.2
Server Hostname:        localhost
Server Port:            5000

Document Path:          /
Document Length:        398 bytes

Concurrency Level:      100
Time taken for tests:   20.783 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      5530000 bytes
HTML transferred:       3980000 bytes
Requests per second:    481.16 [#/sec](mean)
Time per request:       207.829 [ms](mean)
Time per request:       2.078 [ms](mean, across all concurrent requests)
Transfer rate:          259.85 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   2.6      1      74
Processing:     3  205  53.6    199     762
Waiting:        3  205  53.1    199     760
Total:         24  206  53.0    199     763

Percentage of the requests served within a certain time (ms)
  50%    199
  66%    204
  75%    211
  80%    214
  90%    225
  95%    236
  98%    295
  99%    571
 100%    763 (longest request)

++++++++++++++++++++++++++
>>> python --version
Python 3.2.5 (b2091e973da6, Oct 19 2014, 18:30:58)
[PyPy 2.4.0 with GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)]

Python3.5 résultats de bancs


>>>ab -n 10000 -c 100 http://localhost:5000/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Werkzeug/0.11.2
Server Hostname:        localhost
Server Port:            5000

Document Path:          /
Document Length:        398 bytes

Concurrency Level:      100
Time taken for tests:   16.380 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      5530000 bytes
HTML transferred:       3980000 bytes
Requests per second:    610.52 [#/sec](mean)
Time per request:       163.795 [ms](mean)
Time per request:       1.638 [ms](mean, across all concurrent requests)
Transfer rate:          329.70 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   5.8      0     195
Processing:     3  161  44.7    148     475
Waiting:        3  161  44.5    148     475
Total:         59  162  43.9    148     476

Percentage of the requests served within a certain time (ms)
  50%    148
  66%    151
  75%    154
  80%    156
  90%    239
  95%    276
  98%    299
  99%    322
 100%    476 (longest request)

++++++++++++++++++++++++++4
>>> python --version
Python 3.5.0

Si le degré de parallélisme est 1, la vitesse de réponse est de 1,8 à 2,5 ms. Jusqu'à présent, Flask est très rapide (・ ㅂ ・) و

Recommended Posts

Flask + PyPy J'ai pris un benchmark de vitesse avec Blueprint pour le Web à grande échelle
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 2
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 3
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 4
Créez une application Web simple avec Flask
J'ai pris un benchmark de compression h5py
Créer un service Web avec Docker + Flask
J'ai fait une application WEB avec Django
[GCP] Procédure de création d'une application Web avec Cloud Functions (Python + Flask)
Lancer un serveur Web avec Python et Flask
Made Mattermost Bot avec Python (+ Flask)
Création d'une application Web qui mappe les informations sur les événements informatiques avec Vue et Flask
Je veux faire la transition avec un bouton sur le ballon
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai essayé un RPA simple pour me connecter avec du sélénium
J'ai créé un environnement pour Masonite, un framework WEB Python similaire à Laravel, avec Docker!
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
(Échec) Déployer une application Web créée avec Flask avec heroku
J'ai créé un moniteur de ressources pour Raspberry Pi avec une feuille de calcul
Créez un serveur API Web ultra-rapide avec Falcon
(Pour les débutants) Essayez de créer une API Web simple avec Django
Développement d'applications Web avec Flask
Application Web avec Python + Flask ② ③
Application Web avec Python + Flask ④
Créer une application Web de type Flask / Bottle sur AWS Lambda avec Chalice
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
J'ai recherché une carte similaire de Hearthstone avec Deep Learning
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
J'ai essayé de créer un outil d'échafaudage pour le framework Web Python Bottle
J'ai essayé de faire une étrange citation pour Jojo avec LSTM