{"title":"Performance e otimização","version":"5.2","locale":"pt-br","docname":"topics/performance","url":"/pt-br/5.2/topics/performance/","canonical":"https://djangodocs.dev/pt-br/5.2/topics/performance/","summary":"Este documento fornece uma visão geral das técnicas e ferramentas que podem ajudá-lo a rodar o seu código Django com maior eficiência - mais rápido, e usando menos…","html":"<h1>Performance e otimização<a class=\"heading-anchor\" href=\"#performance-and-optimization\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Este documento fornece uma visão geral das técnicas e ferramentas que podem ajudá-lo a rodar o seu código Django com maior eficiência - mais rápido, e usando menos recursos do sistema.</p>\n<section id=\"introduction\">\n<h2>Introdução<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Geralmente a primeira preocupação que surge é escrever código que <em>funcione</em>, no qual a lógica trabalhe de acordo com o que foi definido para produzir a saída esperada. Algumas vezes, entretanto, isso não será o suficiente para fazer o código funcionar de modo tão <em>eficiente</em> quanto seria o desejado.</p>\n<p>Nesse caso, é preciso algo - e na prática, geralmente uma porção de coisas - para melhorar a performance do código sem, ou ao menos minimamente, afetar o seu comportamento.</p>\n</section>\n<section id=\"general-approaches\">\n<h2>Abordagens Comuns<a class=\"heading-anchor\" href=\"#general-approaches\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"what-are-you-optimizing-for\">\n<h3>O que <em>exatamente</em> você está otimizando?<a class=\"heading-anchor\" href=\"#what-are-you-optimizing-for\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>É importante ter uma ideia clara do que você entende por ‘performance’. Não existe uma métrica única para ela.</p>\n<p>Melhorar a velocidade pode ser o objetivo mais óbvio para um programa, mas algumas vezes outras melhorias de performance podem ser desejadas, tais como menor consumo de memória ou menor consumo de recursos de banda da rede ou do banco de dados.</p>\n<p>Melhorias em uma área geralmente irão proporcionar melhor performance em outras, mas nem sempre; algumas vezes uma pode vir em detrimento das outras. Por exemplo, uma melhoria na velocidade de execução de um programa pode fazê-lo usar mais memória. Até pior, ela pode ser contraproducente - Se a melhoria na velocidade de execução consumir tanta memória ao ponto de o sistema começa a ficar sem ela, você terá causado mais mal que bem.</p>\n<p>Existem outras escolhas para ter em mente. O seu próprio tempo é um recurso valioso, mais precioso do que o tempo de CPU. Algumas melhorias podem ser muito difíceis para valer a pena sua implementação, ou podem afetar a portabilidade ou manutenibilidade do seu código. Nem todas as melhorias de performance valem o seu esforço.</p>\n<p>Portanto, você precisa saber quais melhorias de performance você está querendo obter,  e você também precisa ter uma boa razão para caminhar nessa direção - e para tanto você precisa:</p>\n</section>\n<section id=\"performance-benchmarking\">\n<h3>Performance benchmarking<a class=\"heading-anchor\" href=\"#performance-benchmarking\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Não é bom assumir ou simplesmente chutar os locais de ineficiência do seu código.</p>\n<section id=\"django-tools\">\n<h4>Ferramentas do Django<a class=\"heading-anchor\" href=\"#django-tools\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-debug-toolbar/\">django-debug-toolbar</a> is a very handy tool that provides insights into\nwhat your code is doing and how much time it spends doing it. In particular it\ncan show you all the SQL queries your page is generating, and how long each one\nhas taken.</p>\n<p>Painéis de terceiros também estão disponíveis para a barra de ferramentas, que pode (por exemplo) emitir relatórios sobre a performance do cache e tempos de renderização dos templates.</p>\n</section>\n<section id=\"third-party-services\">\n<h4>Serviços de terceiros<a class=\"heading-anchor\" href=\"#third-party-services\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Existem vários serviços gratuitos que podem analisar e emitir relatórios de performance das páginas do seu site sob a perspectiva de um cliente remoto HTTP, simulando assim a experiência de um usuário de verdade.</p>\n<p>These can’t report on the internals of your code, but can provide a useful\ninsight into your site’s overall performance, including aspects that can’t be\nadequately measured from within Django environment.</p>\n<p>Existem também vários outros serviços pagos que fazem uma análise similar, incluindo alguns capazes de identificar o Django e que podem se integrar com o seu código para diagnosticar sua performance de forma bem mais abrangente.</p>\n</section>\n</section>\n<section id=\"get-things-right-from-the-start\">\n<h3>Get things right from the start<a class=\"heading-anchor\" href=\"#get-things-right-from-the-start\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Some work in optimization involves tackling performance shortcomings, but some\nof the work can be built-in to what you’d do anyway, as part of the good\npractices you should adopt even before you start thinking about improving\nperformance.</p>\n<p>A esse respeito Python é uma excelente linguagem para se trabalhar, porque soluções que parecem elegantes e mais adequadas geralmente são também as com melhor performance. Como em muitos trabalhos, aprender o que <em>parece correto</em> leva tempo, mas uma das regras mais úteis é:</p>\n<section id=\"work-at-the-appropriate-level\">\n<h4>Work at the appropriate level<a class=\"heading-anchor\" href=\"#work-at-the-appropriate-level\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>O Django oferece muitas formas diferentes de se resolver um problema, mas só porque é possível fazer algo de uma certa maneira não significa que ela seja a maneira apropriada para resolvê-lo. Por exemplo, você pode acabar descobrindo que é possível calcular a mesma coisa - o número de itens em uma coleção, talvez - em um <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, em Python, ou em um template.</p>\n<p>Porém, quase sempre será mais rápido fazer isso em leveis mais baixos do que em leveis mais altos. Em leveis mais altos o sistema tem que lidar com objetos através de múltiplos níveis de abstração e maquinário.</p>\n<p>Isto é, o banco de dados tipicamente faz coisas mais rápido do que o Python consegue fazer, que por sua vez pode fazê-las mais rápido do que a linguagem de templates.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># QuerySet operation on the database</span>\n<span class=\"c1\"># fast, because that&#39;s what databases are good at</span>\n<span class=\"n\">my_bicycles</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># counting Python objects</span>\n<span class=\"c1\"># slower, because it requires a database query anyway, and processing</span>\n<span class=\"c1\"># of the Python objects</span>\n<span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">my_bicycles</span><span class=\"p\">)</span>\n</code></pre></div>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cm\">&lt;!--</span>\n<span class=\"cm\">Django template filter</span>\n<span class=\"cm\">slower still, because it will have to count them in Python anyway,</span>\n<span class=\"cm\">and because of template language overheads</span>\n<span class=\"cm\">--&gt;</span>\n<span class=\"cp\">{{</span> <span class=\"nv\">my_bicycles</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>De modo geral, o level mais apropriado para o trabalho é o level mais baixo que alguém está disposto a programar.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>O exemplo acima é meramente ilustrativo.</p>\n<p>Firstly, in a real-life case you need to consider what is happening before\nand after your count to work out what’s an optimal way of doing it <em>in that\nparticular context</em>. The database optimization document describes <a class=\"reference internal\" href=\"/pt-br/5.2/topics/db/optimization/#overuse-of-count-and-exists\"><span class=\"std std-ref\">a\ncase where counting in the template would be better</span></a>.</p>\n<p>Em segundo lugar, existem outras opções para considerar: em um caso real, <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">my_bicycles.count</span> <span class=\"pre\">}}</span></code>, que invoca o método <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> diretamente do template, pode ser a escolha mais apropriada.</p>\n</aside>\n</section>\n</section>\n</section>\n<section id=\"caching\">\n<h2>“Caching” – cacheando<a class=\"heading-anchor\" href=\"#caching\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Com frequência ele é custoso (isto é, lento e faminto por recursos) para calcular o valor, então podem existir grandes benefícios em salvá-lo em um cache acessível rapidamente, pronto para a próxima vez em que ele for solicitado.</p>\n<p>É uma técnica suficientemente poderosa e significante que o Django inclui em um vasto framework para caches, assim como outras pequenas peças de funcionalidades envolvendo caches.</p>\n<section id=\"the-caching-framework\">\n<h3><a class=\"reference internal\" href=\"/pt-br/5.2/topics/cache/\"><span class=\"doc\">O framework de “cache” do Django</span></a><a class=\"heading-anchor\" href=\"#the-caching-framework\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/pt-br/5.2/topics/cache/\"><span class=\"doc\">O framework de “cache” do Django</span></a> oferece oportunidades muito significativas de ganhos de performance, salvando conteúdo dinâmico de modo que ele não precise ser calculado a cada requisição.</p>\n<p>Para conveniência, Django oferece diferentes níveis de granularidade de cache: você pode fazer cache da saída de views específicas, ou somente de partes difíceis de se produzir, ou mesmo de um site inteiro.</p>\n<p>Implementing caching should not be regarded as an alternative to improving code\nthat’s performing poorly because it has been written badly. It’s one of the\nfinal steps toward producing well-performing code, not a shortcut.</p>\n</section>\n<section id=\"cached-property\">\n<h3>O decorator <a class=\"reference internal\" href=\"/pt-br/5.2/ref/utils/#django.utils.functional.cached_property\" title=\"django.utils.functional.cached_property\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cached_property</span></code></a><a class=\"heading-anchor\" href=\"#cached-property\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>É comum ter que chamar um método de instância de uma classe mais de uma vez. Se essa função for custosa, fazer isso pode ser um desperdício.</p>\n<p>Usando o decorator <a class=\"reference internal\" href=\"/pt-br/5.2/ref/utils/#django.utils.functional.cached_property\" title=\"django.utils.functional.cached_property\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cached_property</span></code></a> o valor retornado é salvo por uma property; a próxima vez que a função é chamada nessa instância, ela irá retornar o valor salvo ao invés de calculá-lo novamente. Repare que isso só funciona em métodos que recebem <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code> como seu argumento e que ele muda o método para um property.</p>\n<p>Certos componentes Django também tem sua própria funcionalidade de cache, esses são discutidos abaixo nas seções relacionadas a eles.</p>\n</section>\n</section>\n<section id=\"understanding-laziness\">\n<h2>Entendendo laziness<a class=\"heading-anchor\" href=\"#understanding-laziness\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><em>Laziness</em>, ou “preguiça” em português, é uma estratégia complementar ao “caching”. Fazer cache evita reprocessamento através do armazenamento dos resultados; laziness posterga o processamento até que ele seja efetivamente solicitado.</p>\n<p>Laziness nos permite referenciar coisas antes delas serem instanciadas, ou até mesmo antes de ser possível instanciá-las. Isso pode ser usado de várias formas.</p>\n<p>Por exemplo, <a class=\"reference internal\" href=\"/pt-br/5.2/topics/i18n/translation/#lazy-translations\"><span class=\"std std-ref\">traduções “lazy”</span></a> podem ser usadas antes da linguagem alvo se quer ser conhecida, isso porque ela não é usada até que a string a ser traduzida seja efetivamente requerida, como em um template renderizado.</p>\n<p>Laziness é também uma forma de salvar recursos através da tentativa de evitar o trabalho desde o início. Isto é, um aspecto do laziness é não fazer nada até que algo realmente tenha que ser feito, porque pode acontecer de o trabalho não ser necessário. Laziness pode, portanto, ter implicações na performance, e quanto mais custoso for o trabalho, maior o potencial de ganho pelo seu uso.</p>\n<p>O Python fornece uma série de ferramentas para a avaliação de expressões “lazy”, particularmente através das construções <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-generator\" title=\"(em Python v3.14)\"><span class=\"xref std std-term\">generator</span></a> e <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-generator-expression\" title=\"(em Python v3.14)\"><span class=\"xref std std-term\">generator expression</span></a>. É interessante ler mais sobre laziness no Python para descobrir oportunidades de uso desses padrões no seu código.</p>\n<section id=\"laziness-in-django\">\n<h3>Laziness no Django<a class=\"heading-anchor\" href=\"#laziness-in-django\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django is itself quite lazy. A good example of this can be found in the\nevaluation of a <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. <a class=\"reference internal\" href=\"/pt-br/5.2/topics/db/queries/#querysets-are-lazy\"><span class=\"std std-ref\">QuerySets are lazy</span></a>.\nThus a <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> can be created, passed around and combined with other\n<code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> instances, without actually incurring any trips to the database\nto fetch the items it describes. What gets passed around is the <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>\nobject, not the collection of items that - eventually - will be required from\nthe database.</p>\n<p>Por outro lado, <a class=\"reference internal\" href=\"/pt-br/5.2/ref/models/querysets/#when-querysets-are-evaluated\"><span class=\"std std-ref\">certas operações irão forçar a análise do QuerySet</span></a>. Evitar a análise prematura de um <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> pode salvá-lo de fazer uma desnecessária e custosa viagem até o banco de dados.</p>\n<p>O Django também fornece um decorator <a class=\"reference internal\" href=\"/pt-br/5.2/ref/utils/#django.utils.functional.keep_lazy\" title=\"django.utils.functional.keep_lazy\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">keep_lazy()</span></code></a>. Isso permite que uma função chamada com um argumento lazy se comporte de modo lazy, somente sendo analisada quando for realmente necessário. Assim o argumento lazy - que pode ser um argumento custoso - não será chamado para análise a não ser que isso seja estritamente solicitado.</p>\n</section>\n</section>\n<section id=\"databases\">\n<h2>Banco de Dados<a class=\"heading-anchor\" href=\"#databases\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"database-optimization\">\n<h3>Otimização de banco de dados<a class=\"heading-anchor\" href=\"#database-optimization\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django’s database layer provides various ways to help developers get the best\nperformance from their databases. The <a class=\"reference internal\" href=\"/pt-br/5.2/topics/db/optimization/\"><span class=\"doc\">database optimization documentation</span></a> gathers together links to the relevant\ndocumentation and adds various tips that outline the steps to take when\nattempting to optimize your database usage.</p>\n</section>\n<section id=\"other-database-related-tips\">\n<h3>Outras dicas relacionadas a bancos de dados<a class=\"heading-anchor\" href=\"#other-database-related-tips\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Habilitar <a class=\"reference internal\" href=\"/pt-br/5.2/ref/databases/#persistent-database-connections\"><span class=\"std std-ref\">Conexões persistentes</span></a> pode agilizar de forma significativa o tempo de processamento do request em conexões com contas de banco de dados .</p>\n<p>Isso ajuda bastante, por exemplo, máquinas virtuais com performance de rede limitada.</p>\n</section>\n</section>\n<section id=\"http-performance\">\n<h2>Performance HTTP<a class=\"heading-anchor\" href=\"#http-performance\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"middleware\">\n<h3>Middleware<a class=\"heading-anchor\" href=\"#middleware\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O Django já vem com alguns componentes de <a class=\"reference internal\" href=\"/pt-br/5.2/ref/middleware/\"><span class=\"doc\">middleware</span></a> úteis que podem ajudar a otimizar a performance do seu site . Eles incluem:</p>\n<section id=\"conditionalgetmiddleware\">\n<h4><a class=\"reference internal\" href=\"/pt-br/5.2/ref/middleware/#django.middleware.http.ConditionalGetMiddleware\" title=\"django.middleware.http.ConditionalGetMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ConditionalGetMiddleware</span></code></a><a class=\"heading-anchor\" href=\"#conditionalgetmiddleware\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Adds support for modern browsers to conditionally GET responses based on the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code> headers. It also calculates and sets an ETag if\nneeded.</p>\n</section>\n<section id=\"gzipmiddleware\">\n<h4><a class=\"reference internal\" href=\"/pt-br/5.2/ref/middleware/#django.middleware.gzip.GZipMiddleware\" title=\"django.middleware.gzip.GZipMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GZipMiddleware</span></code></a><a class=\"heading-anchor\" href=\"#gzipmiddleware\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Comprime as respostas para todos os browsers modernos, salvando banda e tempo de transferência. Tenha em mente que atualmente o GZipMiddleware é considerado um risco de segurança, e é vulnerável a ataques que anulam a proteção fornecida pelo TLS/SSL. Veja o warning na classe <a class=\"reference internal\" href=\"/pt-br/5.2/ref/middleware/#django.middleware.gzip.GZipMiddleware\" title=\"django.middleware.gzip.GZipMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GZipMiddleware</span></code></a> para mais informações.</p>\n</section>\n</section>\n<section id=\"sessions\">\n<h3>Sessões<a class=\"heading-anchor\" href=\"#sessions\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"using-cached-sessions\">\n<h4>Using cached sessions<a class=\"heading-anchor\" href=\"#using-cached-sessions\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/pt-br/5.2/topics/http/sessions/#cached-sessions-backend\"><span class=\"std std-ref\">Usar sessões “cacheadas”</span></a> pode ser uma forma de melhorar a performance ao eliminar a necessidade de carregar dados de sessão de uma fonte de dados mais lenta como um banco de dados e, ao invés disso, armazenar os dados de sessão mais frequentemente usados em memória.</p>\n</section>\n</section>\n<section id=\"static-files\">\n<h3>Arquivos estáticos<a class=\"heading-anchor\" href=\"#static-files\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Arquivos estáticos,  que por definição não são dinâmicos, são um excelente alvo para ganhos de otimização.</p>\n<section id=\"manifeststaticfilesstorage\">\n<h4><a class=\"reference internal\" href=\"/pt-br/5.2/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage\" title=\"django.contrib.staticfiles.storage.ManifestStaticFilesStorage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManifestStaticFilesStorage</span></code></a><a class=\"heading-anchor\" href=\"#manifeststaticfilesstorage\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Tomando vantagem das habilidades de cache dos browsers web, você pode eliminar totalmente o uso de banda para um dado arquivo depois de seu download inicial.</p>\n<p><a class=\"reference internal\" href=\"/pt-br/5.2/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage\" title=\"django.contrib.staticfiles.storage.ManifestStaticFilesStorage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManifestStaticFilesStorage</span></code></a> appends a\ncontent-dependent tag to the filenames of <a class=\"reference internal\" href=\"/pt-br/5.2/ref/contrib/staticfiles/\"><span class=\"doc\">static files</span></a> to make it safe for browsers to cache them\nlong-term without missing future changes - when a file changes, so will the\ntag, so browsers will reload the asset automatically.</p>\n</section>\n<section id=\"minification\">\n<h4>“Minification”<a class=\"heading-anchor\" href=\"#minification\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Várias ferramentas e pacotes Django desenvolvidos por terceiros fornecem a habilidade de “minificar” HTML, CSS, e JavaScript. Eles removem espaços em branco desnecessários, quebras de linhas e encurtam nomes de variáveis, e assim reduzem o tamanho dos documentos que o seu site publica.</p>\n</section>\n</section>\n</section>\n<section id=\"template-performance\">\n<h2>Performance nos Templates<a class=\"heading-anchor\" href=\"#template-performance\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tenha em mente que:</p>\n<ul class=\"simple\">\n<li><p>usar <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code> é mais rápido do que usar <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">include</span> <span class=\"pre\">%}</span></code></p></li>\n<li><p>Templates muito fragmentados, construídos de várias pequenas peças, podem afetar a performance.</p></li>\n</ul>\n<section id=\"the-cached-template-loader\">\n<h3>A classe cached template loader<a class=\"heading-anchor\" href=\"#the-cached-template-loader\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ativar a classe  <a class=\"reference internal\" href=\"/pt-br/5.2/ref/templates/api/#django.template.loaders.cached.Loader\" title=\"django.template.loaders.cached.Loader\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cached</span> <span class=\"pre\">template</span> <span class=\"pre\">loader</span></code></a> geralmente aumenta a performance drasticamente, já que ela evita compilar cada template novamente sempre que ele tiver que ser renderizado.</p>\n</section>\n</section>\n<section id=\"using-different-versions-of-available-software\">\n<h2>Utilizando versões diferentes do mesmo software disponível<a class=\"heading-anchor\" href=\"#using-different-versions-of-available-software\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Às vezes é bom verificar se versões diferentes e com melhor performance do software que você utiliza estão disponíveis.</p>\n<p>Estas técnicas são para os usuários mais avançados que querem expandir as fronteiras de performance de um site Django já bem otimizado.</p>\n<p>Entretanto, elas não são soluções mágicas para problemas de performance, e elas provavelmente trarão pouco ou nenhum ganho para sites que já não façam as coisas mais básicas do jeito correto.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>É bom repetir: <strong>buscar por alternativas para software que você já usa nunca é a primeira resposta para problemas de performance</strong>. Quando você chegar nesse nível de otimização, você precisa de uma solução formal de benchmarking.</p>\n</aside>\n<section id=\"newer-is-often-but-not-always-better\">\n<h3>Novo é geralmente - mas nem sempre - melhor<a class=\"heading-anchor\" href=\"#newer-is-often-but-not-always-better\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>It’s fairly rare for a new release of well-maintained software to be less\nefficient, but the maintainers can’t anticipate every possible use-case - so\nwhile being aware that newer versions are likely to perform better, don’t\nassume that they always will.</p>\n<p>Isso é o que tem acontecido no Django em si. Sucessivas novas releases têm oferecido um número de melhorias em todo o sistema, mas você ainda deverá verificar a performance de sua aplicação no mundo real, pois em alguns casos você pode acabar descobrindo que mudanças significam um pior desempenho ao invés do contrário.</p>\n<p>Novas versões do Python, e também de suas bibliotecas, também irão com frequência possuir um melhor desempenho - mas meça, ao invés de assumir isso.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>A não ser que você tenha encontrado um problema não usual de performance em uma versão em particular, você geralmente descobrirá melhores funcionalidades, confiabilidade, e segurança em uma nova release e que esses benefícios são muito mais significativos que qualquer performance que você possa ganhar ou perder.</p>\n</aside>\n</section>\n<section id=\"alternatives-to-django-s-template-language\">\n<h3>Alternativas a linguagem de templates do Django<a class=\"heading-anchor\" href=\"#alternatives-to-django-s-template-language\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Para praticamente todos os casos, a linguagem de templates embutida no Django é perfeitamente adequada. Porém, se o gargalo no seu projeto Django parecer ser o sistema de template e você tiver exaurido outras oportunidades de remediar isso, uma alternativa de terceiros pode ser a resposta.</p>\n<p><a class=\"reference external\" href=\"https://jinja.palletsprojects.com/\">Jinja2</a> can offer performance improvements, particularly when it comes to\nspeed.</p>\n<p>Sistemas de template alternativos variam no quanto eles usam da linguagem de template do Django.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p><em>Se</em> você tiver problemas de performance nos templates, a primeira coisa a se fazer é entender exatamente o porquê. Utilizar um sistema de template alternativo pode ser mais rápido, mas os mesmos ganhos também podem estar disponíveis sem ter que passar por esse problema - por exemplo, processamento pesado e lógica nos seus templates podem ser feitos de modo mais eficiente em suas views.</p>\n</aside>\n</section>\n<section id=\"alternative-software-implementations\">\n<h3>Implementações de softwares alternativos<a class=\"heading-anchor\" href=\"#alternative-software-implementations\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pode ser útil checar se o software Python que você está usando foi fornecido em uma implementação diferente que pode executar o mesmo código mais rápido.</p>\n<p>Entretanto: a maioria dos problemas de performance em sites Django bem escritos não estão no nível de execução Python, mas sim em consultas ineficientes ao banco de dados, caches e templates. Se você estiver se apoiando em código Python mal escrito, seus problemas de performance provavelmente não serão resolvidos ao serem executados mais rápido.</p>\n<p>Usar uma implementação alternativa pode introduzir problemas de compatibilidade, implantação, portabilidade, ou manutenção. Nem é preciso dizer que antes de adotar uma implementação atípica você deve se certificar de que ela fornece ganhos de performance suficientes para a sua aplicação que compensem o risco em potencial.</p>\n<p>Com essas ressalvas em mente, você deve conhecer:</p>\n<section id=\"id1\">\n<h4><a class=\"reference external\" href=\"https://www.pypy.org/\">PyPy</a><a class=\"heading-anchor\" href=\"#id1\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference external\" href=\"https://www.pypy.org/\">PyPy</a> is an implementation of Python in Python itself\n(the ‘standard’ Python implementation is in C). PyPy can offer substantial\nperformance gains, typically for heavyweight applications.</p>\n<p>A key aim of the PyPy project is <a class=\"reference external\" href=\"https://www.pypy.org/compat.html\">compatibility</a> with existing Python APIs and libraries.\nDjango is compatible, but you will need to check the compatibility of other\nlibraries you rely on.</p>\n</section>\n<section id=\"c-implementations-of-python-libraries\">\n<h4>Implementações em C de bibliotecas Python<a class=\"heading-anchor\" href=\"#c-implementations-of-python-libraries\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Algumas bibliotecas Python também são implementadas em C, e podem ser muito mais velozes. Elas visam oferecer as mesmas APIs. Tenha em mente que problemas de compatibilidade e diferenças de comportamento não são desconhecidos (e nem sempre evidentes imediatamente).</p>\n</section>\n</section>\n</section>","rootId":"performance-and-optimization","toc":[{"title":"Introdução","anchor":"introduction","children":[]},{"title":"Abordagens Comuns","anchor":"general-approaches","children":[{"title":"O que exatamente você está otimizando?","anchor":"what-are-you-optimizing-for","children":[]},{"title":"Performance benchmarking","anchor":"performance-benchmarking","children":[{"title":"Ferramentas do Django","anchor":"django-tools","children":[]},{"title":"Serviços de terceiros","anchor":"third-party-services","children":[]}]},{"title":"Get things right from the start","anchor":"get-things-right-from-the-start","children":[{"title":"Work at the appropriate level","anchor":"work-at-the-appropriate-level","children":[]}]}]},{"title":"“Caching” – cacheando","anchor":"caching","children":[{"title":"O framework de “cache” do Django","anchor":"the-caching-framework","children":[]},{"title":"O decorator cached_property","anchor":"cached-property","children":[]}]},{"title":"Entendendo laziness","anchor":"understanding-laziness","children":[{"title":"Laziness no Django","anchor":"laziness-in-django","children":[]}]},{"title":"Banco de Dados","anchor":"databases","children":[{"title":"Otimização de banco de dados","anchor":"database-optimization","children":[]},{"title":"Outras dicas relacionadas a bancos de dados","anchor":"other-database-related-tips","children":[]}]},{"title":"Performance HTTP","anchor":"http-performance","children":[{"title":"Middleware","anchor":"middleware","children":[{"title":"ConditionalGetMiddleware","anchor":"conditionalgetmiddleware","children":[]},{"title":"GZipMiddleware","anchor":"gzipmiddleware","children":[]}]},{"title":"Sessões","anchor":"sessions","children":[{"title":"Using cached sessions","anchor":"using-cached-sessions","children":[]}]},{"title":"Arquivos estáticos","anchor":"static-files","children":[{"title":"ManifestStaticFilesStorage","anchor":"manifeststaticfilesstorage","children":[]},{"title":"“Minification”","anchor":"minification","children":[]}]}]},{"title":"Performance nos Templates","anchor":"template-performance","children":[{"title":"A classe cached template loader","anchor":"the-cached-template-loader","children":[]}]},{"title":"Utilizando versões diferentes do mesmo software disponível","anchor":"using-different-versions-of-available-software","children":[{"title":"Novo é geralmente - mas nem sempre - melhor","anchor":"newer-is-often-but-not-always-better","children":[]},{"title":"Alternativas a linguagem de templates do Django","anchor":"alternatives-to-django-s-template-language","children":[]},{"title":"Implementações de softwares alternativos","anchor":"alternative-software-implementations","children":[{"title":"PyPy","anchor":"id1","children":[]},{"title":"Implementações em C de bibliotecas Python","anchor":"c-implementations-of-python-libraries","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Usando o Django","url":"/pt-br/5.2/topics/"}],"prev":{"docname":"topics/security","title":"Segurança no Django","url":"/pt-br/5.2/topics/security/"},"next":{"docname":"topics/serialization","title":"Serialização de objetos Django","url":"/pt-br/5.2/topics/serialization/"},"formats":{"html":"/pt-br/5.2/topics/performance/","markdown":"/pt-br/5.2/topics/performance.md","json":"/pt-br/5.2/topics/performance.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/performance.txt","official":"https://docs.djangoproject.com/pt-br/5.2/topics/performance/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}