Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Numexpr (python madrid)

913 views

Published on

Mini charla presentación de Numexpr en python-madrid (2012-06-14)

Published in: Education
  • Be the first to comment

Numexpr (python madrid)

  1. 1. Numexpr Python-madrid 14/06/2012
  2. 2. Numexpr¿Qué es?Evalua expresiones con numpy arraysLas reescribe de forma más eficienteLas compila al vuelo (gracias a su JIT) a códigopara su máquina virtual (escrita en C)
  3. 3. Numexpr¿Qué es?Además tiene soporte para multi-threading quepermite evitar el GIL
  4. 4. Numexpr¿Dependencias?Numpy
  5. 5. Numexpr• Veamos un ejemplox es un numpy array de 100.000.000 floatsEvaluamos x4Python:y = [x1 ** 4 for x1 in x] (~74 segundos)y = [x1 * x1 * x1 * x1 for x1 in x] (~70 segundos)Numpy:y = x**4 (6.25 segundos) ~12xy=x*x*x*x (0.993 segundos) ~70xNumexpr (1 thread):y = ne.evaluate(‘x**4’) (0.313 segundos) ~210xy = ne.evaluate(‘x * x * x * x’) (0.369 segundos) ~18x
  6. 6. Numexpr• Veamos un ejemplox es un numpy array de 100.000.000 floatsEvaluamos x4
  7. 7. NumexprOperaciones CPU-boundOperaciones donde correrá más si tenemos CPU más rápida, e.g., sin, cos,exp, log, sqrt,... (funciones transcendentes)x, y, z son numpy arrays de 100.000.000 floatsSi hacemos la siguiente operación sin(x) + cos(y) + tan(z)Numpy: 9.12 segundosNumexpr: 9.85 segundos (1 thread) 5.09 segundos (2 threads) 1.8x 3.48 segundos (3 threads) 2.6x 2.71 segundos (4 threads) 3.4x 2.43 segundos (5 threads) 3.8x 2.21 segundos (6 threads) 4.1x 2.02 segundos (7 threads) 4.5x 1.89 segundos (8 threads) 4.8x
  8. 8. NumexprOperaciones CPU-boundOperaciones donde correrá más si tenemos CPU más rápida, e.g., sin, cos,exp, log, sqrt,... (funciones transcendentes)x, y, z son numpy arrays de 100.000.000 floatsSi hacemos la siguiente operación sin(x) + cos(y) + tan(z)
  9. 9. NumexprOperaciones Memory-boundOperaciones donde correrá más si tenemos velocidad de acceso más rápida amemoriax, y, z son numpy arrays de 100.000.000 floatsSi hacemos la siguiente operación x3 + 2y – 3x/zNumpy: 9.98 segundosNumexpr: 1.19 segundos (1 thread) 8.4x 0.64 segundos (2 threads) 15.6x 0.45 segundos (3 threads) 22.2x 0.36 segundos (4 threads) 27.7x 0.33 segundos (5 threads) 30.2x 0.30 segundos (6 threads) 33.3x 0.28 segundos (7 threads) 35.6x 0.26 segundos (8 threads) 38.4x
  10. 10. NumexprOperaciones Memory-boundOperaciones donde correrá más si tenemos velocidad de acceso más rápida amemoriax, y, z son numpy arrays de 100.000.000 floatsSi hacemos la siguiente operación x3 + 2y – 3x/z
  11. 11. NumexprOtro ejemplox, y, z son numpy arrays de 100.000.000 floatsSi hacemos la siguiente operación sin(sqrt(x3 + 2y – 3x/z))Numpy: 6.08 segundosNumexpr: 5.23 segundos (1 thread) 1.2x 2.74 segundos (2 threads) 2.2x 1.88 segundos (3 threads) 3.2x 1.46 segundos (4 threads) 4.2x 1.31 segundos (5 threads) 4.6x 1.19 segundos (6 threads) 5.1x 1.08 segundos (7 threads) 5.6x 0.99 segundos (8 threads) 6.1x
  12. 12. NumexprOtro ejemplox, y, z son numpy arrays de 100.000.000 floatsSi hacemos la siguiente operación sin(sqrt(x3 + 2y – 3x/z))
  13. 13. NumexprFuente: Francesc Alted http://www.youtube.com/watch?v=J3-oN_TulTg
  14. 14. NumexprFuente: Francesc Alted http://www.youtube.com/watch?v=J3-oN_TulTg
  15. 15. NumexprLimitaciones: operaciones element-wise
  16. 16. NumexprUso:>> import numexpr as ne>> ne.evaluate(expresión a evaluar) Lista de operaciones y funciones que se pueden usar: http://code.google.com/p/numexpr/wiki/UsersGuide
  17. 17. NumexprMás numexpr:http://code.google.com/p/numexpr/http://www.youtube.com/watch?v=J3-oN_TulTghttps://python.g-node.org/python-autumnschool-2010/_media/materials/starving_cpus/starvingcpus.pdfhttp://www.pytables.org/docs/CISE-12-2-ScientificPro.pdfPequeños trucos para tus cálculos con numpy y scipy:http://www.scipy.org/PerformanceTips
  18. 18. Numexpr (anexo)• Veamos un ejemplox es un numpy array de 100.000.000 floatsEvaluamos x4 (prueba de última hora) Python: y = [x1 ** 4 for x1 in x] (~74 segundos) y = [x1 * x1 * x1 * x1 for x1 in x] (~70 segundos) Numpy: y = x**4 (6.25 segundos) y=x*x*x*x (0.993 segundos) Numexpr (1 thread): y = ne.evaluate(‘x**4’) (0.313 segundos) y = ne.evaluate(‘x * x * x * x’) (0.369 segundos) Pypy: y = [x1 ** 4 for x1 in x] (~16 segundos) y = [x1 * x1 * x1 * x1 for x1 in x] (~9.5 segundos) Numpypy: y = x**4 (0.00002 segundos) y=x*x*x*x (0.00001 segundos) Numpypy status: http://buildbot.pypy.org/numpy-status/latest.html

×