python3.13

python3.13

  • Revisitando o artigo de shell lento com python3.13

    Quando escrevi o artigo Shell é lento? python teve uma performance miserável. Pra não chamar de outra coisa.

    Resolvi então dar uma revisitada no teste e rodando o python3.13. A cada versão de python dizem que a performance é melhorada. Nada melhor que tirar a prova. E além disso a versão 3.13 permite desabilitar o GIL, o Global Interpreter Locker. Não se se faz alguma diferença num teste desses, mas vamos tentar.

    Eu mantive o mesmo programa que rodei da outra vez:

      
    #! /usr/bin/env python3
    
    for i in range(20000000):
        with open("arq-python3", "w") as fd:
            None   
     
    

    E o resultado:

      
    helio@goosfraba❯ time python3.13 20M-touch.py
    
    ________________________________________________________
    Executed in  621.80 secs    fish           external
       usr time  384.60 secs  998.00 micros  384.60 secs
       sys time  229.78 secs    0.00 micros  229.78 secs
     
    

    Demorou mais que o teste anterior. Se antes foi miserável, essa aqui... Mas antes de botar a culpa no Python, vamos rodar a versão em Go e olhar se os tempos mudaram. O código de Go também continua o mesmo:

      
    package main
    
    import (
            "log"
            "os"
    )
    
    func main() {
            for i := 0; i < 20000000; i++ {
                    fd, err := os.Create("arq-go")
                    fd.Close()
                    if err != nil {
                            log.Fatal(err)
                    }
            }
    }
     
    

    E depois daquela compilada básica:

      
    helio@goosfraba❯ go build -o 20M-touch 20M-touch.go
    helio@goosfraba❯ time ./20M-touch
    
    ________________________________________________________
    Executed in  295.12 secs    fish           external
       usr time   88.50 secs    0.20 millis   88.50 secs
       sys time  199.48 secs    1.03 millis  199.47 secs
     
    

    Realmente baixou o Exu-tranca-sistema no HDD. Da época em que fiz o primeiro teste pra cá a mudança foi a adição de um disco extra de 12 TB. E afetou bastante a performance. De 148s pra 295s com o binário em Go. Nesse caso é melhor rodar o este com cada linguagem pra ver as diferenças no sistema novo e ter um equilíbrio maior entre os resultados.

      
    helio@goosfraba❯ time perl 20M-touch.pl
    
    ________________________________________________________
    Executed in  260.95 secs    fish           external
       usr time   61.45 secs    1.31 millis   61.45 secs
       sys time  195.20 secs    0.04 millis  195.20 secs  
    
    helio@goosfraba❯ time bash 20M-touch.sh 
    
    ________________________________________________________
    Executed in  443.89 secs    fish           external
       usr time  213.20 secs    1.26 millis  213.20 secs
       sys time  227.43 secs    0.04 millis  227.43 secs
     
    

    E pra melhorar o escope de testes, adicionei ainda a versão em C++:

      
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main() {
      for (int i=0;i<20000000;i++) {
        ofstream MyFile("arq-cpp");
        MyFile.close();
      }
    }    
     
    

    O resultado:

      
    helio@goosfraba❯ time ./20M-touch-cpp 
    
    ________________________________________________________
    Executed in  205.39 secs    fish           external
       usr time   39.56 secs  359.00 micros   39.56 secs
       sys time  163.64 secs  911.00 micros  163.64 secs
     
    

    O resultados foram então (do mais rápido pro mais lento):

  • c++: 205.39s
  • perl: 260.95s
  • go: 295.12s
  • bash: 443.89s
  • python: 621.80s
  • Enquanto C++ manteve a performance esperada, perl deu um show. Eu pessoalmente achei que Go! ficou devendo, ainda mais se comparado com C++. Mas python... python fracassou miseravelmente. E de novo.

    E fui tentar rodar com o GIL desabilitado e...

      
    helio@goosfraba❯ time env PYTHON_GIL=0 python3.13 20M-touch.py
    Fatal Python error: config_read_gil: Disabling the GIL is not supported by this build
    Python runtime state: preinitialized
    
    
    ________________________________________________________
    Executed in    4.91 millis    fish           external
       usr time    2.03 millis    1.09 millis    0.95 millis
       sys time    2.85 millis    0.02 millis    2.83 millis
     
    

    Vou precisar compilar um python3.13 com a configuração que permite desabilitar o GIL...

    Update: compilei um pacote do AUR.

      
    ==> Creating package "python313-freethreaded"...
      -> Generating .PKGINFO file...
      -> Generating .BUILDINFO file...
      -> Generating .MTREE file...
      -> Compressing package...
    ==> Leaving fakeroot environment.
    ==> Finished making: python313-freethreaded 3.13.3-1 (Mon 12 May 2025 06:04:15 PM CEST)
    ==> Cleaning up...
     
    

    E vamos aos resultados:

      
    helio@goosfraba❯ time env PYTHON_GIL=0 python3.13t 20M-touch.py
    
    ________________________________________________________
    Executed in   31.58 mins    fish           external
       usr time   14.01 mins    0.00 millis   14.01 mins
       sys time   17.25 mins    1.96 millis   17.25 mins
     
    

    Python continua parecendo que bateu uma feijuca antes de rodar os testes. Não que remover o GIL fosse mudar muita coisa uma vez que o teste é sequencial. Mas podia ter melhorado um pouco.

    Enquanto isso também descobri o porquê dos testes estarem mais lentos: tem algum treco do yay compilando. Sei lá eu o que é uma vez que estou conectado remotamente.

We use cookies

We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience (tracking cookies). You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.