Djangoプロジェクトに高性能Pony ORMを組み込む

以前のパフォーマンス投稿では、 Pjan ORMについて説明し、Django ORMおよびSQLAlchemyと比較して素晴らしい結果が得られました。



このような並外れた結果に感銘を受け、自分のプロジェクトのパフォーマンスを懸念して、私は自分のプロジェクトにPony ORMを実装することにしました。 それから来たものは、ロールを参照してください。





誘惑



もちろん、プロジェクトを再度書き直すこともできます。 この誘惑は、使用するツールにルーツがある問題に遭遇した開発者を常に覆い隠します。 ただし、すでに記述されたコードの量、膨大な分岐データモデル、およびプロジェクトで使用されたDjangoの非常に機能するプラグインの印象的な量は、この道に大きく太い十字架をかけました。



代替案



しばらく前、Django ORMの代替案を探して、 Aldjemyの興味深いプロジェクトに出会いました。 これはDjango ORMのごく一部であり、Djangoモデル構造を使用してSQLAlchemyモデルの代替階層を構築できます。 このアプローチにより、プロジェクトの基礎(Djangoデータモデル全体を含む)を維持しながら、SQLAlchemyを正確に、必要な場所でのみ使用できます。 このプロジェクトのアイデアに触発され、 特定の数行のコードを舐めると、 Pony ORMをDjango ORMにねじ込んでdjony(DJango pONY)と呼ぶ同様のライブラリを作成しました。



短期遠足



ジョニーの使用は簡単です。 システムにdjonyをインストールした後(たとえば、 pip install git+git://github.com/nnseva/djony.git@master#egg=djony



)、settings.pyで使用されるアプリケーションの1つとしてdjonyを指定できます。 djonyはリストの最新のアプリケーションでなければならないことを覚えておく必要があります。



現在、各Djangoモデル(つまり、クラスとしてのモデル)には属性 `p`(単語ponyから)があります。 これはPony ORMモデルです。 Ponyのドキュメントによると、モデルを使用する必要がある場所ならどこでも使用できます。 ormモジュールも必要になります。これは、ponyモジュールからインポートできます( from pony import orm



)。 または、djony.ormモジュールのすべての変数、およびdjony固有の関数と変数を含むdjony.ormモジュールを使用できます。



Pony ORMモデルオブジェクトには、データモデルと関係構造に応じたデータフィールドとオブジェクトコレクションのみが含まれます(将来的には、自動的に作成されたPony ORMモデルにメンバーを追加する機能を強化する必要があります)。



テスト



次に、最も一般的な操作の1つであるパフォーマンスのテストを試みましょう-ユーザー権限のチェック。



Djangoの場合は、既製のUser.has_perm関数を使用します。 もちろん、Pony ORMの場合、この関数とほぼ同等のコードを記述する必要があります。



 def has_perm(user,perm): if not user.is_active: return False app_label,codename = perm.split('.') for p in orm.select( p for p in Permission.p if (user in p.user_set or user in p.group_set.user_set) and p.codename == codename and p.content_type.app_label == app_label ): return True return False
      
      







テスト結果を見てみましょう(テストでは、1000人のユーザーがデータベースで起動され、テスト用のバラストの役割を果たしました)。



 >>> import test_pony >>> import test_django >>> test_django.test_django() check user permissions: django req/seq: 170.308759221 req time (ms): 5.8716886 >>> test_pony.test_pony() check user permissions: pony req/seq: 729.517146462 req time (ms): 1.3707697
      
      







ご覧のとおり、私たちは4回以上獲得しています。 いいね!



アプリケーション。 テストコード。





test_django.py




 import datetime from django.contrib.auth.models import User def test_django(): t1 = datetime.datetime.now() for i in range(10000): test() t2 = datetime.datetime.now() print "check user permissions: django req/seq:",10000/(t2-t1).total_seconds(),'req time (ms):',(t2-t1).total_seconds()/10. def test(): user = User.objects.get(username='testuser') return user.has_perm('auth.add_user')
      
      







test_pony.py




 import datetime from django.contrib.auth.models import User, Permission def test_pony(): t1 = datetime.datetime.now() for i in range(10000): test() t2 = datetime.datetime.now() print "check user permissions: pony req/seq:",10000/(t2-t1).total_seconds(),'req time (ms):',(t2-t1).total_seconds()/10. from djony import orm @orm.db_session def test(): user = User.p.get(username='testuser') return has_perm(user,'auth.add_user') def has_perm(user,perm): if not user.is_active: return False app_label,codename = perm.split('.') for p in orm.select( p for p in Permission.p if (user in p.user_set or user in p.group_set.user_set) and p.codename == codename and p.content_type.app_label == app_label ): return True return False
      
      






All Articles