Sfoglia il codice sorgente

Merge pull request #1627 from methane/python-r11

Python updates for Round 11
Mike Smith 10 anni fa
parent
commit
1d91314931

+ 4 - 4
frameworks/Python/README.md

@@ -6,10 +6,10 @@ For further guidance, review the
 
 ## Infrastructure Software Versions
 
-* [python2 2.7.9](https://www.python.org/)
-* [python3 3.4.2](https://www.python.org/)
-* [pypy 2.4.0](http://pypy.org/)
-* [nginx 1.4.1](http://nginx.org/)
+* [Python2 2.7.10](https://www.python.org/)
+* [Python3 3.4.3](https://www.python.org/)
+* [PyPy 2.6.0](http://pypy.org/)
+* [nginx](http://nginx.org/)
 
 ## Get Help
 

+ 6 - 6
frameworks/Python/bottle/requirements-pypy.txt

@@ -1,6 +1,6 @@
-bottle==0.12.7
-bottle-sqlalchemy==0.4.1
-SQLAlchemy==0.9.7
-gunicorn==19.1
-PyMySQL==0.6.2
-tornado==3.2.2
+bottle==0.12.8
+bottle-sqlalchemy==0.4.2
+SQLAlchemy==1.0.4
+gunicorn==19.3.0
+PyMySQL==0.6.6
+tornado==4.2

+ 6 - 6
frameworks/Python/bottle/requirements.txt

@@ -1,8 +1,8 @@
-bottle==0.12.7
-bottle-sqlalchemy==0.4.1
-SQLAlchemy==0.9.4
-gunicorn==19.1
+bottle==0.12.8
+bottle-sqlalchemy==0.4.2
+SQLAlchemy==1.0.4
+gunicorn==19.3.0
 meinheld==0.5.7
-mysqlclient==1.3.1
-greenlet==0.4.5
+mysqlclient==1.3.6
+greenlet==0.4.7
 uwsgi

+ 2 - 2
frameworks/Python/cherrypy/requirements.txt

@@ -1,6 +1,6 @@
-cherrypy==3.6.0
+cherrypy==3.7.0
 
 bleach==1.4.1
 
-SQLAlchemy==0.9.9
+SQLAlchemy==1.0.4
 mysqlclient==1.3.6

+ 4 - 4
frameworks/Python/django/hello/world/views.py

@@ -30,12 +30,12 @@ def json(request):
   response = {
     "message": "Hello, World!"
   }
-  return HttpResponse(uj_dumps(response), mimetype="application/json")
+  return HttpResponse(uj_dumps(response), content_type="application/json")
 
 def db(request):
   r = random.randint(1, 10000)
   world = uj_dumps({'id' : r, 'randomNumber' : World.objects.get(id=r).randomnumber})
-  return HttpResponse(world, mimetype="application/json")
+  return HttpResponse(world, content_type="application/json")
 
 def dbs(request):
   queries = _get_queries(request)
@@ -56,7 +56,7 @@ def dbs(request):
   # for complicated serializations of joins and crazy query sets etc
   # test xrange vs range if the query number is gigantic
   worlds = uj_dumps([{'id' : r, 'randomNumber' : g(id=r).randomnumber} for r in [rp() for q in xrange(queries)]])
-  return HttpResponse(worlds, mimetype="application/json")
+  return HttpResponse(worlds, content_type="application/json")
 
 def fortunes(request):
   fortunes = list(Fortune.objects.all())
@@ -79,4 +79,4 @@ def update(request):
     w.save()
     worlds.append({'id' : r, 'randomNumber' : w.randomnumber})
 
-  return HttpResponse(uj_dumps(worlds), mimetype="application/json")
+  return HttpResponse(uj_dumps(worlds), content_type="application/json")

+ 5 - 5
frameworks/Python/django/requirements.txt

@@ -1,10 +1,10 @@
-Django==1.6.5
+Django==1.8.2
 
-mysqlclient==1.3.1
-psycopg2==2.5.3
+mysqlclient==1.3.6
+psycopg2==2.6
 ujson==1.33
 
-gunicorn==19.1
+gunicorn==19.3.0
 meinheld==0.5.7
 
-greenlet==0.4.5
+greenlet==0.4.7

+ 3 - 3
frameworks/Python/falcon/requirements-pypy.txt

@@ -1,3 +1,3 @@
-gunicorn==19.1
-tornado==3.2.2
-falcon==0.1.9
+gunicorn==19.3.0
+tornado==4.2
+falcon==0.3.0

+ 4 - 4
frameworks/Python/falcon/requirements.txt

@@ -1,6 +1,6 @@
-gunicorn==19.1
+gunicorn==19.3.0
 meinheld==0.5.7
-Cython==0.20.1
-falcon==0.1.9
+Cython==0.22
+falcon==0.3.0
 
-greenlet==0.4.5
+greenlet==0.4.7

+ 1 - 6
frameworks/Python/flask/README.md

@@ -15,14 +15,9 @@ All test implementations are located within a single file
 
 Flask + Flask-SQLAlchemy
 
-### Interpreter
-
-* CPython 2.7.4
-* PyPy 2.0
-
 ### Database
 
-MySQL (MySQL-python on CPython, PyMySQL on PyPy)
+MySQL (mysqlclient on CPython, PyMySQL on PyPy)
 
 ### Server
 

+ 28 - 16
frameworks/Python/flask/app.py

@@ -10,6 +10,7 @@ import flask
 from flask import Flask, request, render_template, make_response, jsonify
 from flask.ext.sqlalchemy import SQLAlchemy
 from sqlalchemy import create_engine
+from sqlalchemy.ext import baked
 
 if sys.version_info[0] == 3:
     xrange = range
@@ -22,6 +23,7 @@ try:
 except ImportError:
     mysql_schema = "mysql+pymysql:"
 
+
 # setup
 
 app = Flask(__name__)
@@ -30,21 +32,30 @@ app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False
 db = SQLAlchemy(app)
 dbraw_engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], connect_args={'autocommit': True}, pool_reset_on_return=None)
 
+bakery = baked.bakery()
+
+
 # models
 
 class World(db.Model):
-  __tablename__ = "World"
-  id = db.Column(db.Integer, primary_key=True)
-  randomNumber = db.Column(db.Integer)
-  
-  # http://stackoverflow.com/questions/7102754/jsonify-a-sqlalchemy-result-set-in-flask
-  @property
-  def serialize(self):
-     """Return object data in easily serializeable format"""
-     return {
-         'id'         : self.id,
-         'randomNumber': self.randomNumber
-     }
+    __tablename__ = "World"
+    id = db.Column(db.Integer, primary_key=True)
+    randomNumber = db.Column(db.Integer)
+
+    # http://stackoverflow.com/questions/7102754/jsonify-a-sqlalchemy-result-set-in-flask
+    @property
+    def serialize(self):
+        """Return object data in easily serializeable format"""
+        return {
+            'id'         : self.id,
+            'randomNumber': self.randomNumber
+        }
+
+    @staticmethod
+    def get(ident):
+        baked_query = bakery(lambda s: s.query(World))
+        return baked_query(db.session()).get(ident)
+
 
 class Fortune(db.Model):
     __tablename__ = "Fortune"
@@ -74,7 +85,7 @@ def get_random_world():
         num_queries = 1
     if num_queries > 500:
         num_queries = 500
-    worlds = [World.query.get(randint(1, 10000)).serialize
+    worlds = [World.get(randint(1, 10000)).serialize
               for _ in xrange(num_queries)]
     return json_response(worlds)
 
@@ -82,7 +93,7 @@ def get_random_world():
 @app.route("/dbs")
 def get_random_world_single():
     wid = randint(1, 10000)
-    worlds = World.query.get(wid).serialize
+    worlds = World.get(wid).serialize
     return json_response(worlds)
 
 
@@ -143,11 +154,12 @@ def updates():
     ids = [rp() for _ in xrange(num_queries)]
     ids.sort()  # To avoid deadlock
     for id in ids:
-        world = World.query.get(id)
+        world = World.get(id)
         world.randomNumber = rp()
         worlds.append(world.serialize)
+    res = json_response(worlds)
     db.session.commit()
-    return json_response(worlds)
+    return res
 
 
 @app.route("/raw-updates")

+ 6 - 6
frameworks/Python/flask/requirements-pypy.txt

@@ -1,8 +1,8 @@
 Jinja2==2.7.3
-Werkzeug==0.9.6
+Werkzeug==0.10.4
 flask==0.10.1
-SQLAlchemy==0.9.7
-Flask-SQLAlchemy==1.0
-mysqlclient==1.3.1
-gunicorn==19.1
-tornado==3.2.2
+SQLAlchemy==1.0.4
+Flask-SQLAlchemy==2.0
+mysqlclient==1.3.6
+gunicorn==19.3.0
+tornado==4.2

+ 6 - 6
frameworks/Python/flask/requirements.txt

@@ -1,11 +1,11 @@
 Jinja2==2.7.3
-Werkzeug==0.9.6
+Werkzeug==0.10.4
 flask==0.10.1
-SQLAlchemy==0.9.7
-Flask-SQLAlchemy==1.0
-mysqlclient==1.3.1
-gunicorn==19.1
+SQLAlchemy==1.0.4
+Flask-SQLAlchemy==2.0
+mysqlclient==1.3.6
+gunicorn==19.3.0
 meinheld==0.5.7
 uwsgi
 
-greenlet==0.4.5
+greenlet==0.4.7

+ 1 - 1
frameworks/Python/historical/webware/requirements.txt

@@ -1,3 +1,3 @@
 bleach==1.4.1
 mysqlclient==1.3.6
-SQLAlchemy==0.9.9
+SQLAlchemy==1.0.4

+ 1 - 1
frameworks/Python/klein/requirements.txt

@@ -2,5 +2,5 @@ klein==15.0.0
 
 bleach==1.4.1
 mysqlclient==1.3.6
-SQLAlchemy==0.9.9
+SQLAlchemy==1.0.4
 jinja2==2.7.3

+ 5 - 5
frameworks/Python/pyramid/requirements.txt

@@ -1,8 +1,8 @@
-psycopg2==2.5.3
-gunicorn==19.1
+psycopg2==2.6
+gunicorn==19.3.0
 meinheld==0.5.7
-SQLAlchemy==0.9.7
-pyramid==1.5.1
+SQLAlchemy==1.0.4
+pyramid==1.5.7
 pyramid_chameleon==0.3
 
-greenlet==0.4.5
+greenlet==0.4.7

+ 3 - 3
frameworks/Python/tornado/requirements.txt

@@ -1,3 +1,3 @@
-tornado==3.2.2
-motor==0.3.2
-Momoko==1.1.4
+tornado==4.2
+motor==0.4.1
+Momoko==2.0.0

+ 11 - 10
frameworks/Python/tornado/server.py

@@ -45,7 +45,8 @@ class DBTestHandler(BaseHandler):
     def get(self):
         world = yield db.World.find_one(randint(1, 10000))
         # Get first postion on arguments, and so first postion in mongo return
-        world['id'] = str(world.pop('_id'))
+        world['id'] = int(world.pop('_id'))
+        world['randomNumber'] = int(world['randomNumber'])
         response = json.dumps(world)
         self.set_header("Content-Type", "application/json; charset=UTF-8")
         self.write(response)
@@ -68,7 +69,8 @@ class QueryTestHandler(BaseHandler):
                         for _ in xrange(queries)]
         for world in worlds:
             # Get first postion on arguments, and so first postion in mongo return
-            world['id'] = str(world.pop('_id'))
+            world['id'] = int(world.pop('_id'))
+            world['randomNumber'] = int(world['randomNumber'])
         response = json.dumps(worlds)
         self.set_header("Content-Type", "application/json; charset=UTF-8")
         self.write(response)
@@ -80,9 +82,7 @@ class QueryPostgresRawTestHandler(BaseHandler):
         sql = "SELECT id, randomNumber FROM World WHERE id=%s"
 
         random_id = randint(1, 10000)
-        cursor = yield momoko.Op(
-            self.application.db.execute, sql, (random_id,)
-        )
+        cursor = yield self.application.db.execute(sql, (random_id,))
         row = cursor.fetchone()
         response = json.dumps({"id": row[0], "randomNumber": row[1]})
 
@@ -106,9 +106,7 @@ class MultipleQueriesPostgresRawTestHandler(BaseHandler):
         worlds = []
         for i in xrange(int(queries)):
             random_id = randint(1, 10000)
-            cursor = yield momoko.Op(
-                self.application.db.execute, sql, (random_id,)
-            )
+            cursor = yield self.application.db.execute(sql, (random_id,))
             row = cursor.fetchone()
             worlds.append({"id": row[0], "randomNumber": row[1]})
         response = json.dumps(worlds)
@@ -130,9 +128,12 @@ if __name__ == "__main__":
     server = tornado.httpserver.HTTPServer(application)
     server.bind(options.port)
     server.start(0)
+
+    ioloop = tornado.ioloop.IOLoop.instance()
     if options.postgres:
         dsn = "user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world host=%s" % options.postgres
-        application.db = momoko.Pool(dsn, size=1)
+        application.db = momoko.Pool(dsn, size=1, max_size=100)
+        ioloop.run_sync(application.db.connect)
     else:
         db = motor.MotorClient(options.mongo).hello_world
-    tornado.ioloop.IOLoop.instance().start()
+    ioloop.start()

+ 2 - 2
frameworks/Python/turbogears/requirements.txt

@@ -1,8 +1,8 @@
-tg.devtools==2.3.4
+tg.devtools==2.3.5
 
 bleach==1.4.1
 
-SQLAlchemy==0.9.9
+SQLAlchemy==1.0.4
 zope.sqlalchemy==0.7.6
 mysqlclient==1.3.6
 jinja2==2.7.3

+ 1 - 1
frameworks/Python/uwsgi/requirements.txt

@@ -1,3 +1,3 @@
-gevent==1.0.1
+gevent==1.0.2
 uwsgi
 ujson==1.33

+ 4 - 4
frameworks/Python/wheezyweb/requirements.txt

@@ -1,12 +1,12 @@
-wheezy.web==0.1.469
-wheezy.template==0.1.159
+wheezy.web==0.1.485
+wheezy.template==0.1.167
 
 bleach==1.4.1
 
-SQLAlchemy==0.9.9
+SQLAlchemy==1.0.4
 mysqlclient==1.3.6
 
 gunicorn==19.3.0
 meinheld==0.5.7
 
-greenlet==0.4.5
+greenlet==0.4.7

+ 0 - 7
frameworks/Python/wsgi/README.md

@@ -8,13 +8,6 @@ review the [documentation](http://frameworkbenchmarks.readthedocs.org/en/latest/
 Also note that there is additional information provided in 
 the [Python README](../).
 
-## Infrastructure Software Versions
-
-The tests were run with:
-
-* [Python 2.7.3](http://www.python.org/)
-* [Gunicorn 0.17.2](http://gunicorn.org/)
-
 ## Test Paths & Sources
 
 * [JSON Serialization](hello.py): "/json"

+ 2 - 2
frameworks/Python/wsgi/requirements.txt

@@ -1,6 +1,6 @@
 ujson==1.33
 uwsgi
-gunicorn==19.1
+gunicorn==19.3.0
 meinheld==0.5.7
 
-greenlet==0.4.5
+greenlet==0.4.7

+ 6 - 8
toolset/setup/linux/languages/pypy.sh

@@ -3,13 +3,11 @@
 RETCODE=$(fw_exists ${IROOT}/pypy.installed)
 [ ! "$RETCODE" == 0 ] || { return 0; }
 
-fw_get https://bitbucket.org/pypy/pypy/downloads/pypy-2.5.0-linux64.tar.bz2 -O pypy-2.5.0-linux64.tar.bz2
-fw_untar pypy-2.5.0-linux64.tar.bz2
-ln -sf pypy-2.5.0-linux64 pypy
-
-if [ ! -f "get-pip.py" ]; then
-fw_get https://bootstrap.pypa.io/get-pip.py -O get-pip.py
-fi
-${IROOT}/pypy/bin/pypy get-pip.py
+fw_get https://bitbucket.org/pypy/pypy/downloads/pypy-2.6.0-linux64.tar.bz2 -O pypy-2.6.0-linux64.tar.bz2
+fw_untar pypy-2.6.0-linux64.tar.bz2
+ln -sf pypy-2.6.0-linux64 pypy
+
+${IROOT}/pypy/bin/pypy -m ensurepip -U
+${IROOT}/pypy/bin/pip install -U setuptools pip
 
 touch ${IROOT}/pypy.installed

+ 3 - 3
toolset/setup/linux/languages/python2.sh

@@ -3,9 +3,9 @@
 RETCODE=$(fw_exists ${IROOT}/py2.installed)
 [ ! "$RETCODE" == 0 ] || { return 0; }
 
-fw_get http://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
-fw_untar Python-2.7.9.tgz
-cd Python-2.7.9
+fw_get http://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz
+fw_untar Python-2.7.10.tgz
+cd Python-2.7.10
 ./configure --prefix=${IROOT}/py2 --disable-shared --quiet
 make -j4 --quiet 2>&1 | tee $IROOT/python-install.log | awk '{ if (NR%100 == 0) printf "."}'
 make install --quiet 2>&1 | tee -a $IROOT/python-install.log | awk '{ if (NR%100 == 0) printf "."}'

+ 3 - 3
toolset/setup/linux/languages/python3.sh

@@ -3,9 +3,9 @@
 RETCODE=$(fw_exists ${IROOT}/py3.installed)
 [ ! "$RETCODE" == 0 ] || { return 0; }
 
-fw_get http://www.python.org/ftp/python/3.4.2/Python-3.4.2.tar.xz
-fw_untar Python-3.4.2.tar.xz
-cd Python-3.4.2
+fw_get http://www.python.org/ftp/python/3.4.3/Python-3.4.3.tar.xz
+fw_untar Python-3.4.3.tar.xz
+cd Python-3.4.3
 ./configure --prefix=${IROOT}/py3 --disable-shared --with-computed-gotos --quiet
 make -j4 --quiet 2>&1 | tee $IROOT/python3-install.log | awk '{ if (NR%100 == 0) printf "."}'
 make install --quiet 2>&1 | tee -a $IROOT/python3-install.log | awk '{ if (NR%100 == 0) printf "."}'