SlideShare una empresa de Scribd logo
Facundo Batista
Python más rápido        Lucio Torre
que C
Objetivos

●   Divertirse

●   Comparar tiempos de ejecución en Python y C

●   Sin perder de vista otros factores
    ●   Errores tontos ( < 5 seg)
    ●   Errores complicados ( > 10 min, una taza de café y una patada al sofá)
    ●   Cantidad de lineas de código
    ●   Complejidad de diseño


●   ¡Pero haciendo énfasis en el tiempo!
    ●   ¿Es C más rápido que Python?
    ●   ¿Cuándo? ¿Cuánto?
PyPy.... wtf?

●   También comparamos tiempos con PyPy

●   Es un intérprete de Python... escrito en Python

●   Más flexible, ideal para probar cosas nuevas
Disclaimer

●   C
    ●   Lo codeó Lucio
    ●   Sin librerías externas (excepto una, ya verán)



●   Python
    ●   Lo codeó Facundo
    ●   Sin utilizar ninguna librería externa (NumPy, etc.)
    ●   Sin ninguna pseudocompilación (Pyrex, Psyco, etc.)


●   PyPy
    ●   Exactamente el mismo código en Python
Gap
  Bajo nivel                    Alto nivel
  (código final)                   (ideas)




  ASM         C                  Python

¡este camino lo tiene que recorrer alguien!
Multiplicar un número

       ASM                                        C
  .file    "mult.c"
  .text
                                             void main(void)
.globl main                                  {
  .type    main, @function
main:                                        int a=5, b=10, c;
  leal
  andl
          4(%esp), %ecx
          $-16, %esp
                                             c = a * b;
  pushl    -4(%ecx)                          }
  pushl    %ebp
  movl    %esp, %ebp
  pushl    %ecx
  subl    $16, %esp

                                              Python
  movl    $5, -16(%ebp)
  movl    $10, -12(%ebp)
  movl    -16(%ebp), %eax
  imull    -12(%ebp), %eax
  movl    %eax, -8(%ebp)
  addl    $16, %esp                           a = 5
  popl    %ecx
  popl    %ebp                                b = 10
  leal
  ret
          -4(%ecx), %esp                      c = a * b
  .size    main, .-main
  .section    .note.GNU-stack,"",@progbits
Traduciendo
●   C se pasa a ASM en tiempo de compilación

●   Python a instrucciones de su VM:
    2     0 LOAD_CONST           1 (5)
          3 STORE_FAST           0 (a)

    3     6 LOAD_CONST           2 (10)
          9 STORE_FAST           1 (b)

    4     12   LOAD_FAST         0 (a)
          15   LOAD_FAST         1 (b)
          18   BINARY_MULTIPLY
          19   STORE_FAST        2 (c)
          22   LOAD_CONST        0 (None)
          25   RETURN_VALUE


                                 ¿Cómo comparamos?
ptrace
int main()
{   pid_t child;
    BIGNUM *count;

    child = fork();

    count = BN_new();

    if(child == 0) {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        execl("/usr/bin/python", "python", "nada.py", NULL);

    } else {
        int status;
        while(1) {
            wait(&status);
            if(WIFEXITED(status))
                break;
            ptrace(PTRACE_SINGLESTEP, child, NULL, NULL);
            BN_add(count, count, BN_value_one());
        }
        printf("Total %sn", BN_bn2dec(count));
    }
    return 0;
}
Cuánto ejecutamos
Vemos cuantas instrucciones se ejecutan...
●   Haciendo Nada, para ver el costo por estructura
●   Multiplicando un sólo número
●   Realizando 100 mil multiplicaciones
    Ej 0
                  Nada       Una     100k     por op
    C           101047    101054    701055         6
    Python    15767781 15834089 93349599        775


     ¡Python es más de 100 veces más lento!
                         ¿Posta?
Multiplicamos un número

   ¿Cuanto se tarda en todo el proceso?

              edición   compilación   ejecución
C                x           y            z
python          x/2          0          z * 100
calculadora     x/5          0         q (q <<x)




         Para definir una metrica, lo
          importante es el contexto
Un caso más real
Tomamos muchos valores de algún lado:
 ●   Generamos previamente un millón de pares de enteros
 ●   Los leemos y multiplicamos

                Ej 1
                         Code [m]      Run [s]   Factor
                C                 10     0,68
                Python             4     5,63     8,23
                PyPy               -     2,27     3,32    0,40



Vemos que C es mucho más rápido que Python en este caso,
             donde el procesador hace todo
     En Python hicimos mucho más que multiplicar dos ints.
                ¡PyPy es más rápido que Python!
Soportando big nums
Casi lo mismo que antes...
 ●   Usamos enteros de entre 0 y 32 dígitos
 ●   En Python no hay que hacer nada
 ●   En C tuvimos que usar una biblioteca externa

            C                 58       9,16
            Python             0     10,77      1,18
            PyPy               -     11,53      1,26   1,07



                     ¡Rayas y centollas!

                   ¿Multiplicando enteros
                Python es tan rápido como C?
¡A la hoguera!




¡Herejía, herejía!


(acá abandonamos el
primer día de trabajo)
Enfocándonos
Tratamos de apuntar a performance
 ●   Dejamos de usar tanto disco


Explotamos ventajas de C
 ●   Acceso a memoria
 ●   Multiplicación pura


¡Multiplicamos matrices!
 ●   Tiempo de codeo: C: 50 min         Python: 18 min   PyPy: 0 :)
 ●   De 10x10, 100x100 y 200x200
 ●   Multiplicamos por si misma muchas veces
 ●   len( str( m[0][0] ) ) de la última: 3518!
Matrices
Ej 3
                   Python                           C                              PyPy
  **            10     100   200            10       100      200            10       100    200
   2            1,2     2,3   11            0,0       0,2       1            1,5       1,8     4
   5            1,2     5,9   42            0,0       0,8       7            1,5       3,0    16
  10            1,2   12,7    97            0,0       2,3      20            1,5       5,9    40
  20            1,2   28,7   223            0,0       6,4      52            1,6      14,1   113
  40            1,2   65,1   501            0,0      18,8     158            1,6      40,0   337
  80            1,3  162,7 1306             0,1      61,3     506            1,6     120,3 1057
 160            1,6  453,0 3634             0,2     210,4    1742            1,9     404,2 3375
 320            2,5 1389,8 11271            0,6     763,4    6326            2,8    1410,0 11716
       Tiempo




                                   Tiempo




                                                                    Tiempo
                   Potencia                       Potencia                         Potencia
Relación entre ellos
10                                                       2.0

 9                                                       1.8

 8                                                       1.6

 7                                                       1.4

 6                                                       1.2

 5                                                       1.0

 4                                                       0.8

 3                                                       0.6

 2                                                       0.4

 1                                                       0.2

 0                                                       0.0

        100x100       200x200      100x100    200x200          100x100         200x200
        Python / C    Python / C   PyPy / C   PyPy / C         PyPy / Python   PyPy / Python




     Python y PyPy son más parecidos a C cuanto más
                   grande es el cálculo
                           (no tenemos ni idea por qué)
     PyPy es más rápido que Python, tiende a ser igual
Saliendo de los números
Realizamos un ejercicio más clásico
 ●   Tomamos un texto grande (todo Shakespeare)
 ●   Generamos al azar una lista de tokens de ese texto
 ●   El ejercicio es escribir en otro archivo esas palabras y en que
     posición del texto original aparecen...

                    Ej 4
                              Code [m]    Run [s]
                    C               40        47
                                                           Update!
                    Python          22       144
                    ...                                 PyPy / Python:
                    Python          +5        60             0,94

                                Factor:     1,28


                 Python es tan rápido cómo C
                  si lo optimizamos un poco
Optimizando


    Optimizamos después
     de revisar tiempos


     Es más fácil
  optimizar código
correcto que corregir
 código optimizado
Enfocándonos (de nuevo)
Tratamos de eliminar overheads comunes
 ●   No escribimos más a disco
 ●   Mostramos la palabra que aparece más cerca del final (y en
     que posición aparece)
                   Ej 5
                            Code [m]      Run [s]
                                                      Update!
                   C                 1      0,25
                                                    PyPy / Python:
                   Python            1     11,00
                                                         0,39
                                 Factor    44,00

     C es mucho más rápido que Python en este caso

        Porque modelamos la solución minimizando
              el uso de memoria dinámica.
Conclu...

C es más rápido que Python, especialmente si...
 ●   Dejamos que el procesador haga todo el trabajo
 ●   Nos escapamos lo más posible de la memoria dinámica



        Pero esto lo encontramos ajustando las
       tareas para que tengan esas propiedades.

     En los experimentos pensados sin forzar esto,
              Python es tan rápido como C
...siones

    Muchas veces C es más
       rápido que Python,
   pero no siempre se justifica
        el esfuerzo extra


Nada concluyente sobre PyPy: pero
  vale la pena tenerlo en cuenta
Recuerden


We should forget about small efficiencies,
 say about 97% of the time: premature
   optimization is the root of all evil.

                 Donald Knuth
          Structured Programming with goto Statements
                 ACM Journal Computing Surveys
                  Vol 6, No. 4, Dec. 1974. p.268
Copyright
            Facundo Batista y Lucio Torre




                              Licencia


Atribución-No Comercial-Compartir Obras Derivadas Igual 2.5 Genérica
     http://creativecommons.org/licenses/by-nc-sa/2.5/deed.es_AR

Más contenido relacionado

Similar a Pyrapidc

Python Vs C
Python Vs CPython Vs C
Python Vs C
arcangelsombra
 
Phyton
PhytonPhyton
Go python, go
Go python, goGo python, go
Go python, go
Sergio Schvezov
 
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Ronny Morán
 
Python workshop
Python workshopPython workshop
Introduccion a Ppython
Introduccion a PpythonIntroduccion a Ppython
Introduccion a Ppython
Hugo Alberto Rivera Diaz
 
Introduccion a Python
Introduccion a PythonIntroduccion a Python
Introduccion a Python
Andrés Ignacio Martínez Soto
 
Cpp
CppCpp
Gestión y Análisis de Datos para las Ciencias Económicas con Python y R
Gestión y Análisis de Datos para las Ciencias Económicas con Python y RGestión y Análisis de Datos para las Ciencias Económicas con Python y R
Gestión y Análisis de Datos para las Ciencias Económicas con Python y R
Francisco Palm
 
UTPL-LÓGICA DE LA PROGRAMACIÓN-II BIMESTRE-(abril agosto 2012)
UTPL-LÓGICA DE LA PROGRAMACIÓN-II BIMESTRE-(abril agosto 2012)UTPL-LÓGICA DE LA PROGRAMACIÓN-II BIMESTRE-(abril agosto 2012)
UTPL-LÓGICA DE LA PROGRAMACIÓN-II BIMESTRE-(abril agosto 2012)
Videoconferencias UTPL
 
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesUsando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Martín Volpe
 
Manual De Javascript
Manual De JavascriptManual De Javascript
Manual De JavascriptSteven Gomez
 
javascript
 javascript javascript
javascript
Claudio Padron
 
Javascript
JavascriptJavascript
Javascript
Walter Carmona
 

Similar a Pyrapidc (20)

Python Vs C
Python Vs CPython Vs C
Python Vs C
 
MFSI
MFSIMFSI
MFSI
 
Phyton
PhytonPhyton
Phyton
 
Go python, go
Go python, goGo python, go
Go python, go
 
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
 
Python workshop
Python workshopPython workshop
Python workshop
 
Introduccion a Ppython
Introduccion a PpythonIntroduccion a Ppython
Introduccion a Ppython
 
Floyd
FloydFloyd
Floyd
 
Introduccion a Python
Introduccion a PythonIntroduccion a Python
Introduccion a Python
 
Cpp
CppCpp
Cpp
 
Cpp
CppCpp
Cpp
 
Gestión y Análisis de Datos para las Ciencias Económicas con Python y R
Gestión y Análisis de Datos para las Ciencias Económicas con Python y RGestión y Análisis de Datos para las Ciencias Económicas con Python y R
Gestión y Análisis de Datos para las Ciencias Económicas con Python y R
 
UTPL-LÓGICA DE LA PROGRAMACIÓN-II BIMESTRE-(abril agosto 2012)
UTPL-LÓGICA DE LA PROGRAMACIÓN-II BIMESTRE-(abril agosto 2012)UTPL-LÓGICA DE LA PROGRAMACIÓN-II BIMESTRE-(abril agosto 2012)
UTPL-LÓGICA DE LA PROGRAMACIÓN-II BIMESTRE-(abril agosto 2012)
 
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesUsando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
 
Fund Java
Fund JavaFund Java
Fund Java
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 
Manual De Javascript
Manual De JavascriptManual De Javascript
Manual De Javascript
 
Javascript
JavascriptJavascript
Javascript
 
javascript
 javascript javascript
javascript
 
Javascript
JavascriptJavascript
Javascript
 

Pyrapidc

  • 2. Objetivos ● Divertirse ● Comparar tiempos de ejecución en Python y C ● Sin perder de vista otros factores ● Errores tontos ( < 5 seg) ● Errores complicados ( > 10 min, una taza de café y una patada al sofá) ● Cantidad de lineas de código ● Complejidad de diseño ● ¡Pero haciendo énfasis en el tiempo! ● ¿Es C más rápido que Python? ● ¿Cuándo? ¿Cuánto?
  • 3. PyPy.... wtf? ● También comparamos tiempos con PyPy ● Es un intérprete de Python... escrito en Python ● Más flexible, ideal para probar cosas nuevas
  • 4. Disclaimer ● C ● Lo codeó Lucio ● Sin librerías externas (excepto una, ya verán) ● Python ● Lo codeó Facundo ● Sin utilizar ninguna librería externa (NumPy, etc.) ● Sin ninguna pseudocompilación (Pyrex, Psyco, etc.) ● PyPy ● Exactamente el mismo código en Python
  • 5. Gap Bajo nivel Alto nivel (código final) (ideas) ASM C Python ¡este camino lo tiene que recorrer alguien!
  • 6. Multiplicar un número ASM C .file "mult.c" .text void main(void) .globl main { .type main, @function main: int a=5, b=10, c; leal andl 4(%esp), %ecx $-16, %esp c = a * b; pushl -4(%ecx) } pushl %ebp movl %esp, %ebp pushl %ecx subl $16, %esp Python movl $5, -16(%ebp) movl $10, -12(%ebp) movl -16(%ebp), %eax imull -12(%ebp), %eax movl %eax, -8(%ebp) addl $16, %esp a = 5 popl %ecx popl %ebp b = 10 leal ret -4(%ecx), %esp c = a * b .size main, .-main .section .note.GNU-stack,"",@progbits
  • 7. Traduciendo ● C se pasa a ASM en tiempo de compilación ● Python a instrucciones de su VM: 2 0 LOAD_CONST 1 (5) 3 STORE_FAST 0 (a) 3 6 LOAD_CONST 2 (10) 9 STORE_FAST 1 (b) 4 12 LOAD_FAST 0 (a) 15 LOAD_FAST 1 (b) 18 BINARY_MULTIPLY 19 STORE_FAST 2 (c) 22 LOAD_CONST 0 (None) 25 RETURN_VALUE ¿Cómo comparamos?
  • 8. ptrace int main() { pid_t child; BIGNUM *count; child = fork(); count = BN_new(); if(child == 0) { ptrace(PTRACE_TRACEME, 0, NULL, NULL); execl("/usr/bin/python", "python", "nada.py", NULL); } else { int status; while(1) { wait(&status); if(WIFEXITED(status)) break; ptrace(PTRACE_SINGLESTEP, child, NULL, NULL); BN_add(count, count, BN_value_one()); } printf("Total %sn", BN_bn2dec(count)); } return 0; }
  • 9. Cuánto ejecutamos Vemos cuantas instrucciones se ejecutan... ● Haciendo Nada, para ver el costo por estructura ● Multiplicando un sólo número ● Realizando 100 mil multiplicaciones Ej 0 Nada Una 100k por op C 101047 101054 701055 6 Python 15767781 15834089 93349599 775 ¡Python es más de 100 veces más lento! ¿Posta?
  • 10. Multiplicamos un número ¿Cuanto se tarda en todo el proceso? edición compilación ejecución C x y z python x/2 0 z * 100 calculadora x/5 0 q (q <<x) Para definir una metrica, lo importante es el contexto
  • 11. Un caso más real Tomamos muchos valores de algún lado: ● Generamos previamente un millón de pares de enteros ● Los leemos y multiplicamos Ej 1 Code [m] Run [s] Factor C 10 0,68 Python 4 5,63 8,23 PyPy - 2,27 3,32 0,40 Vemos que C es mucho más rápido que Python en este caso, donde el procesador hace todo En Python hicimos mucho más que multiplicar dos ints. ¡PyPy es más rápido que Python!
  • 12. Soportando big nums Casi lo mismo que antes... ● Usamos enteros de entre 0 y 32 dígitos ● En Python no hay que hacer nada ● En C tuvimos que usar una biblioteca externa C 58 9,16 Python 0 10,77 1,18 PyPy - 11,53 1,26 1,07 ¡Rayas y centollas! ¿Multiplicando enteros Python es tan rápido como C?
  • 13. ¡A la hoguera! ¡Herejía, herejía! (acá abandonamos el primer día de trabajo)
  • 14. Enfocándonos Tratamos de apuntar a performance ● Dejamos de usar tanto disco Explotamos ventajas de C ● Acceso a memoria ● Multiplicación pura ¡Multiplicamos matrices! ● Tiempo de codeo: C: 50 min Python: 18 min PyPy: 0 :) ● De 10x10, 100x100 y 200x200 ● Multiplicamos por si misma muchas veces ● len( str( m[0][0] ) ) de la última: 3518!
  • 15. Matrices Ej 3 Python C PyPy ** 10 100 200 10 100 200 10 100 200 2 1,2 2,3 11 0,0 0,2 1 1,5 1,8 4 5 1,2 5,9 42 0,0 0,8 7 1,5 3,0 16 10 1,2 12,7 97 0,0 2,3 20 1,5 5,9 40 20 1,2 28,7 223 0,0 6,4 52 1,6 14,1 113 40 1,2 65,1 501 0,0 18,8 158 1,6 40,0 337 80 1,3 162,7 1306 0,1 61,3 506 1,6 120,3 1057 160 1,6 453,0 3634 0,2 210,4 1742 1,9 404,2 3375 320 2,5 1389,8 11271 0,6 763,4 6326 2,8 1410,0 11716 Tiempo Tiempo Tiempo Potencia Potencia Potencia
  • 16. Relación entre ellos 10 2.0 9 1.8 8 1.6 7 1.4 6 1.2 5 1.0 4 0.8 3 0.6 2 0.4 1 0.2 0 0.0 100x100 200x200 100x100 200x200 100x100 200x200 Python / C Python / C PyPy / C PyPy / C PyPy / Python PyPy / Python Python y PyPy son más parecidos a C cuanto más grande es el cálculo (no tenemos ni idea por qué) PyPy es más rápido que Python, tiende a ser igual
  • 17. Saliendo de los números Realizamos un ejercicio más clásico ● Tomamos un texto grande (todo Shakespeare) ● Generamos al azar una lista de tokens de ese texto ● El ejercicio es escribir en otro archivo esas palabras y en que posición del texto original aparecen... Ej 4 Code [m] Run [s] C 40 47 Update! Python 22 144 ... PyPy / Python: Python +5 60 0,94 Factor: 1,28 Python es tan rápido cómo C si lo optimizamos un poco
  • 18. Optimizando Optimizamos después de revisar tiempos Es más fácil optimizar código correcto que corregir código optimizado
  • 19. Enfocándonos (de nuevo) Tratamos de eliminar overheads comunes ● No escribimos más a disco ● Mostramos la palabra que aparece más cerca del final (y en que posición aparece) Ej 5 Code [m] Run [s] Update! C 1 0,25 PyPy / Python: Python 1 11,00 0,39 Factor 44,00 C es mucho más rápido que Python en este caso Porque modelamos la solución minimizando el uso de memoria dinámica.
  • 20. Conclu... C es más rápido que Python, especialmente si... ● Dejamos que el procesador haga todo el trabajo ● Nos escapamos lo más posible de la memoria dinámica Pero esto lo encontramos ajustando las tareas para que tengan esas propiedades. En los experimentos pensados sin forzar esto, Python es tan rápido como C
  • 21. ...siones Muchas veces C es más rápido que Python, pero no siempre se justifica el esfuerzo extra Nada concluyente sobre PyPy: pero vale la pena tenerlo en cuenta
  • 22. Recuerden We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Donald Knuth Structured Programming with goto Statements ACM Journal Computing Surveys Vol 6, No. 4, Dec. 1974. p.268
  • 23. Copyright Facundo Batista y Lucio Torre Licencia Atribución-No Comercial-Compartir Obras Derivadas Igual 2.5 Genérica http://creativecommons.org/licenses/by-nc-sa/2.5/deed.es_AR