fbpx
django-course-thumbnail

Tips Meningkatkan Kinerja Django

Halo, Alan Lovers! Kalian merupakan pengguna Django dalam mengembangkan aplikasi? Artikel ini harus kalian baca karena akan berguna untuk mendapatkan tips meningkatkan kinerja Django.

Dalam artikel ini, kami ingin memberikan sedikit pencerahan tentang kesalahan umum dalam optimasi kinerja Django, dan menunjukkan cara mencari bottlenecks.

Tips #1: Optimasi Database

Banyak orang memulai optimasi query database di Django yang memakan sekitar 5% dari semua permintaan berulang kali. Sayangnya, sebagian besar pengembang hanya menambahkan select_related/prefetch_related ke QuerySets Django untuk mengurangi jumlah query ke database.

Hal ini memang mengurangi jumlah query, tetapi bagaimana dengan durasi waktunya? Perubahan semacam itu akan meningkatkan waktu yang dibutuhkan untuk menyelesaikan permintaan, dan yang lebih penting, dengan signifikan meningkatkan waktu yang diperlukan di production server.

Jangan pernah mencoba mengoptimalkan query pada mesin pengembangan kalian.

The Postgres planner collects statistics about your data that help identify the best possible execution plan for your query. In fact, it will just use heuristics to determine the query plan if the table has little to no data in it. Not only do you need realistic production data in order to analyze reasonable query plans, but also the Postgres server’s configuration has a big effect. For this reason, it’s required that you run your analysis on either the production box, or on a staging box that is configured just like production, and where you’ve restored production data

Cuplikan dari artikel Harold’s Geminez

Tips #2: Optimasi Kode

Mungkin semua orang tahu tentang django-extension dengan RunProfileServer, tapi solusi ini tidak begitu nyaman untuk digunakan. Karena data yang dibaca akan sangat banyak dan muncul dalam format yang sulit dibaca.

Sebagai alternatif, kalian bisa menggunakan line_profiler. Paket ini memungkinkan kalian untuk memeriksa kinerja Django dari bagian-bagian kode tertentu. Pada dasarnya, kalian harus menulis skrip untuk mengevaluasi kode yang dibutuhkan dan menempatkan dekorator @profile pada metode yang kalian minati.

Sebagai hasilnya, Anda akan menerima:

  • Jumlah waktu yang dibutuhkan oleh setiap metode
  • Total waktu yang dihabiskan
  • Waktu per hit Jumlah hit
  • Waktu untuk setiap baris metode yang ditampilkan dalam persen

Jika kalian ingin meningkatkan kinerja Django, ada dua opsi untuk menjalankan tampilan dalam proyek Django untuk memeriksa optimasi kinerja. Cara pertama lebih mudah tetapi tidak mengungkapkan middleware dan kode Django. Cara kedua sedikit lebih rumit tetapi memberikan kemungkinan untuk mengukur middleware.

#!/usr/bin/env python
import os
os.environ.setdefault(
    'DJANGO_SETTINGS_MODULE',
    'django_classifier_profile.settings'
)
import django
django.setup()
from django.test.client import RequestFactory
from django_classifier_profile.apps.account.models import User
from django_classifier_profile.apps.account.views import ProfileEditView
request_factory = RequestFactory()
user = User.objects.get()
request = request_factory.get('/')
request.session = {}
request.user = user
view = ProfileEditView.as_view()
view(request).render()

Dengan membuat permintaan palsu dan memanggil tampilan secara langsung, kalian dapat mensimulasikan permintaan yang sebenarnya dan mengukur kinerja kode kalian. Metode render diperlukan untuk menjalankan rendering template dan mengevaluasi objek malas, yang dapat memengaruhi kinerja aplikasi.

#!/usr/bin/env python
import os
os.environ.setdefault(
    'DJANGO_SETTINGS_MODULE',
    'django_classifier_profile.settings'
)
import django
django.setup()
from django.core.servers.basehttp import get_internal_wsgi_application
from django.test.client import RequestFactory
from django_classifier_profile.apps.account.models import User
request_factory = RequestFactory()
user = User.objects.get()
request = request_factory.get('/')
request.session = {}
request._cached_user = user
#request.user = user
app = get_internal_wsgi_application()
app.get_response(request)

Dalam skrip ini, kita coba menggunakan aplikasi WSGI untuk memanggil view dan memberikan kemungkinan untuk mengevaluasi alur Django dengan middlewares dan penguraian template. Untuk mendapatkan hasil, kalian hanya perlu menjalankan dua perintah. Pertama, untuk mengevaluasi kode yang diprofil, menulis, dan mengumpulkan statistik ke file:

 $ kernprof –l <script_name.py>

Perintah kedua digunakan untuk menampilkan hasil dari profiling.

 $ python -m line_profiler <script_name.py>.lprof

Teknik optimisasi Django ini memungkinkan kamu untuk mencapai hasil yang baik, yang pada akhirnya akan memudahkan dalam bekerja dengan proyek. Hasilnya akan terlihat seperti ini:

Timer unit: 1e-06 s
Total time: 1.4e-05 s
File: /Users/quard/.pyenv/versions/3.5.3/envs/django-classifier-shop/lib/python3.5/site-packages/django/contrib/auth/middleware.py
Function: process_request at line 17
Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    17                                               @profile
    18                                               def process_request(self, request):
    19         1            2      2.0     14.3          assert hasattr(request, 'session'), (
    20                                                       "The Django authentication middleware requires session middleware "
    21                                                       "to be installed. Edit your MIDDLEWARE%s setting to insert "
    22                                                       "'django.contrib.sessions.middleware.SessionMiddleware' before "
    23                                                       "'django.contrib.auth.middleware.AuthenticationMiddleware'."
    24                                                   ) % ("_CLASSES" if settings.MIDDLEWARE is None else "")
    25         1           12     12.0     85.7          request.user = SimpleLazyObject(lambda: get_user(request))
Total time: 0.005354 s
File: /Users/quard/Projects/learn/django-classifier-profile/django_classifier_profile/apps/account/views.py
Function: get_object at line 18
Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    18                                               @profile
    19                                               def get_object(self, queryset=None):
    20                                                   if (
    21         3            9      3.0      0.2              not self.kwargs.get(self.pk_url_kwarg)
    22         1            2      2.0      0.0              and not self.kwargs.get(self.slug_url_kwarg)
    23                                                   ):
    24         1            9      9.0      0.2              self.kwargs[self.pk_url_kwarg] = self.request.user.pk
    25
    26         3         5272   1757.3     98.5          user = super(ProfileEditView, self).get_object(queryset=queryset)
    27
    28         3           60     20.0      1.1          if user != self.request.user and not self.request.user.is_superuser:
    29                                                       raise HttpResponseForbidden
    30
    31         3            2      0.7      0.0          return user
Total time: 0.010449 s
File: /Users/quard/Projects/learn/django-classifier-profile/django_classifier_profile/apps/account/views.py
Function: get_formset at line 59
Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    59                                               @profile
    60                                               def get_formset(self):
    61                                                   """
    62                                                   create formset of attributes with help of custome formset class
    63                                                   """
    64         1            1      1.0      0.0          FormSetClass = modelformset_factory(
    65         1            1      1.0      0.0              UserAttribute,
    66         1            1      1.0      0.0              formset=UserClassifierFormSet,
    67         1            1      1.0      0.0              form=UserAttributeForm,
    68         1            0      0.0      0.0              can_delete=True,
    69         1          892    892.0      8.5              extra=0
    70                                                   )

Kesimpulan

Kami berharap tips meningkatkan kinerja Django ini dapat membantu dan menghindari membuat kesalahan dasar namun penting di masa depan saat bekerja dengan proyekmu.

Kamu tertarik untuk mengembangkan website tapi bingung gimana caranya? Jangan khawatir, Alan Creative hadir untuk membantu menyelesaikan masalah kamu. Kami menyediakan layanan pembuatan website dengan profesional. Tunggu apalagi? Hubungi kami sekarang juga untuk mendapatkan penawaran terbaik!

Sebarkan konten ini jika bermanfaat:

Facebook
Twitter
Pinterest
LinkedIn

Leave a Reply

Your email address will not be published. Required fields are marked *

PORTOFOLIO KAMI:

PRODUK ALAN:

Media Sosial kami:

ARTIKEL POPULER!

Dapatkan info terbaru!

Dapatkan artikel & info terbaru!

Tidak ada spam, hanya artikel dan info terbaru!

KATEGORI ARTIKEL

Banyak artikel lain disini!

Baca artikel lainnya...

Konsultasi aja dulu. Gratis!

Hubungi kami untuk mendapatkan proposal penawaran jika project brief/requirement (dokumen proyek) sudah ada dan lengkap.
Konsultasi yuk ->
Butuh konsultasi?
Hai,

Alan Creative disini, kami berharap anda tersenyum dan bahagia hari ini. Ada yang dapat kami bantu? Jika iya, jangan sungkan menghubungi kami.

Salam hangat,
Alan Creative