यहां आपकी MySQL स्क्रिप्ट का SQLAlchemy संस्करण है जो MySQLdb के लिए तीन की तुलना में चार सेकंड में प्रदर्शन करता है:
from sqlalchemy import Integer, Column, create_engine, MetaData, Table
import datetime
metadata = MetaData()
foo = Table(
'foo', metadata,
Column('id', Integer, primary_key=True),
Column('a', Integer(), nullable=False),
Column('b', Integer(), nullable=False),
Column('c', Integer(), nullable=False),
)
class Foo(object):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
engine = create_engine('mysql+mysqldb://scott:[email protected]/test', echo=True)
start = datetime.datetime.now()
with engine.connect() as conn:
foos = [
Foo(row['a'], row['b'], row['c'])
for row in
conn.execute(foo.select().limit(1000000)).fetchall()
]
print "total time: ", datetime.datetime.now() - start
रनटाइम:
total time: 0:00:04.706010
यहाँ एक स्क्रिप्ट है जो ऑब्जेक्ट पंक्तियों को पूरी तरह से लोड करने के लिए ORM का उपयोग करती है; प्रति उपज का उपयोग करते हुए सभी 1M वस्तुओं के साथ एक निश्चित सूची के निर्माण से बचने के द्वारा, यह 13 सेकंड में चलता है SQLAlchemy मास्टर के साथ (रिलीज़ 0.9 के साथ 18 सेकंड):
import time
from sqlalchemy import Integer, Column, create_engine, Table
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Foo(Base):
__table__ = Table(
'foo', Base.metadata,
Column('id', Integer, primary_key=True),
Column('a', Integer(), nullable=False),
Column('b', Integer(), nullable=False),
Column('c', Integer(), nullable=False),
)
engine = create_engine('mysql+mysqldb://scott:[email protected]/test', echo=True)
sess = Session(engine)
now = time.time()
# avoid using all() so that we don't have the overhead of building
# a large list of full objects in memory
for obj in sess.query(Foo).yield_per(100).limit(1000000):
pass
print("Total time: %d" % (time.time() - now))
फिर हम इन दो दृष्टिकोणों के बीच अंतर को विभाजित कर सकते हैं, और ओआरएम के साथ केवल अलग-अलग कॉलम लोड कर सकते हैं:
for obj in sess.query(Foo.id, Foo.a, Foo.b, Foo.c).yield_per(100).limit(1000000):
pass
उपरोक्त फिर से 4 सेकंड में चलता है ।
SQLAlchemy Core की तुलना कच्चे MySQLdb कर्सर की तुलना में अधिक उपयुक्त है। यदि आप ORM का उपयोग करते हैं लेकिन अलग-अलग कॉलम के लिए क्वेरी करते हैं, तो यह सबसे हाल के संस्करणों में लगभग चार सेकंड है।
ओआरएम स्तर पर, गति के मुद्दे इसलिए हैं क्योंकि पायथन में ऑब्जेक्ट बनाना धीमा है, और SQLAlchemy ORM इन ऑब्जेक्ट्स को बड़ी मात्रा में बहीखाता पद्धति पर लागू करता है क्योंकि यह उन्हें प्राप्त करता है, जो यूनिट सहित इसके उपयोग अनुबंध को पूरा करने के लिए आवश्यक है। काम का, पहचान का नक्शा, उत्सुक लोडिंग, संग्रह, आदि।
क्वेरी को नाटकीय रूप से तेज़ करने के लिए, पूर्ण ऑब्जेक्ट के बजाय अलग-अलग कॉलम प्राप्त करें। यहां की तकनीकें देखेंhttp://docs .sqlalchemy.org/hi/latest/faq/performance.html#result-fetching-slowness-orm जो इसका वर्णन करते हैं।
PeeWee से आपकी तुलना के लिए, PW बहुत कम सुविधाओं के साथ एक बहुत ही सरल प्रणाली है, जिसमें यह भी शामिल है कि यह पहचान मानचित्रों के साथ कुछ भी नहीं करता है। PeeWee के साथ भी, ORM जितना आसान हो सके, इसमें अभी भी 15 सेकंड का समय लगता है। , जो इस बात का प्रमाण है कि cPython वास्तव में वास्तव में धीमा है कच्चे MySQLdb फ़ेच की तुलना में जो सीधे सी में है।
Java की तुलना में, Java VM cPython की तुलना में बहुत तेज़ है . हाइबरनेट हास्यास्पद है जटिल है, फिर भी जेआईटी के कारण जावा वीएम बेहद तेज है और यहां तक कि सभी जटिलताएं भी तेजी से चलती हैं। यदि आप Python की तुलना Java से करना चाहते हैं, तो Pypy का उपयोग करें।