Python en español #14: Tertulia 2021-01-05
Description
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter:
@jcea, https://blog.jcea.es/,
https://www.jcea.es/. Conectando desde Madrid.Eduardo Castro, email:
info@ecdesign.es. Conectando desde A
Guarda.Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako,
programador python y amante de vim, conectando desde Huelva.Juan Carlos, conectando desde Bilbao.
Audio editado por Pablo Gómez, twitter:
@julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason
Shaw. Publicada en https://audionautix.com/ con licencia
- Creative Commons Attribution 4.0 International
License.
<timestamp compact="1" offset="52" ts="92">[01:32 ]<topic> Nuevas versiones: Python 3.10a4 y Numpy.</topic></timestamp>
<timestamp compact="1" offset="52" ts="117">[01:57 ]<topic> Don’t Use Recursion In Python Any More,Python Closure —
A Pythonic technique you must know</topic></timestamp>Don’t Use Recursion In Python Any More,Python Closure — A
Pythonic technique you must know:
https://towardsdatascience.com/dont-use-recursion-in-python-any-more-918aad95094c.Hilo en la lista de correo de Python Madrid:
https://lists.es.python.org/pipermail/madrid/2021-January/004838.html.Closure:
https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).Mixin: https://es.wikipedia.org/wiki/Mixin.
<timestamp compact="1" offset="52" ts="602">[10:02 ]<topic> ¿Qué es ser "Pythónico"?</topic></timestamp>
Twisted daña el cerebro: https://twistedmatrix.com/trac/.
unittest: https://docs.python.org/3/library/unittest.html.
Black: https://pypi.org/project/black/.
from __future__ import braces
.
<timestamp compact="1" offset="52" ts="892">[14:52 ]<topic> Python Ideas:</topic></timestamp>
<timestamp compact="1" offset="52" ts="1012">[16:52 ]<topic> ¿Comillas simples o comillas dobles?
'
o"
.</topic></timestamp>- Diferencias semánticas con otros lenguajes como C.
<timestamp compact="1" offset="52" ts="1387">[23:07 ]<topic> Tamaño de columnas: ¿80?, ¿120?, ¿132?</topic></timestamp>
<timestamp compact="1" offset="52" ts="1862">[31:02 ]<topic> Primar la legibilidad, no el rendimiento.</topic></timestamp>
Cuando tienes
if ... else ...
, ¿Qué caso pones primero?,
¿el corto o el largo? ¿Primero la condición normal?Microoptimizaciones que complican la legibilidad sin
ganancia de rendimiento que importe en realidad.
<timestamp compact="1" offset="52" ts="2517">[41:57 ]<topic> En las variables locales, la longitud del nombre de una
variable no impacta en el rendimiento.</topic></timestamp><timestamp compact="1" offset="52" ts="2582">[43:02 ]<topic> Curiosear el "bytecode"
https://es.wikipedia.org/wiki/Bytecode que genera Python.</topic></timestamp>Dispositivo de Duff:
https://es.wikipedia.org/wiki/Dispositivo_de_Duff.El "bytecode" https://es.wikipedia.org/wiki/Bytecode que
genera Python no está nada optimizado. Es mejorable.
<timestamp compact="1" offset="52" ts="2782">[46:22 ]<topic> Bytecode generado para
a + a
:</topic></timestamp>>>> dis.dis(lambda a: a + a)
1 0 LOAD_FAST 0 (a)
2 LOAD_FAST 0 (a)
4 BINARY_ADD
6 RETURN_VALUE¡Guardas!
Sí se hacen algunas optimizaciones simples:
>>> dis.dis(lambda : 5 + 3)
1 0 LOAD_CONST 1 (8)
2 RETURN_VALUE
<timestamp compact="1" offset="52" ts="3012">[50:12 ]<topic> Python deja su pila de evaluación vacía al terminar de
calcular una expresión.</topic></timestamp>Máquina virtual de registros en vez de máquina virtual
orientada a pila.- El compilador debe ser más sofisticado, pero puede
reutilizar valores.
- El compilador debe ser más sofisticado, pero puede
Muchas operaciones redundantes:
>>> import dis
>>> def suma(valores):
... s=0
... for i in valores:
... s+=i
... return s
...
>>> dis.dis(suma)
2 0 LOAD_CONST 1 (0)
2 STORE_FAST 1 (s)
3 4 LOAD_FAST 0 (valores)
6 GET_ITER
>> 8 FOR_ITER 12 (to 22)
10 STORE_FAST 2 (i)
4 12 LOAD_FAST 1 (s)
14 LOAD_FAST 2 (i)
16 INPLACE_ADD
18 STORE_FAST 1 (s)
20 JUMP_ABSOLUTE 8
5 >> 22 LOAD_FAST 1 (s)
24 RETURN_VALUE¿Qué ocurre a la hora de depurar o para gestionar
excepciones?
<timestamp compact="1" offset="52" ts="3392">[56:32 ]<topic> Que un hilo modifique variables de otro hilo.</topic></timestamp>
¡Guardas!
NOTA DESDE EL FUTURO:
Python 3.9.5:
https://docs.python.org/release/3.9.5/whatsnew/changelog.html.Traceback objects allow accessing frame objects without
triggering audit hooks:
https://bugs.python.org/issue42800.
<timestamp compact="1" offset="52" ts="3517">[58:37 ]<topic> Pensábais que las interioridades del intérprete de
Python son aburridas, pero no...</topic></timestamp>La complejidad debe estar en tu programa, no en el lenguaje
o el intérprete.Compiladores optimizadores. Python se está quedando atrás.
Hacer caché al buscar atributos:
Issue1616125: Cached globals+builtins lookup optimization:
https://bugs.python.org/issue1616125.issue43452: Microoptimize PyType_Lookup for cache hits
https://bugs.python.org/issue43452.Detectar cambios en un diccionario, incluyendo
diccionarios internos comolocals
o__builtins__
:
PEP 509 Add a private version to dict:
https://www.python.org/dev/peps/pep-0509/.
<timestamp compact="0" offset="52" ts="4012">[01:06:52 ]<topic> Huevos de pascua en Python:</topic></timestamp>
from __future__ import braces
.import antigravity
.import this
.import __hello__
.
<timestamp compact="0" offset="52" ts="4107">[01:08:27 ]<topic> Usar
pass
o...
(ellipsis).</topic></timestamp>- Ellipsis:
https://docs.python.org/3/library/constants.html#Ellipsis
y
https://docs.python.org/3/library/stdtypes.html?highlight=ellipsis#the-ellipsis-object.
- Ellipsis:
<timestamp compact="0" offset="52" ts="4162">[01:09:22 ]<topic> El PEP 509 no es para hacer diccionarios inmutables.</topic></timestamp>
Es algo interno para el API de C. No está accesible desde
Python.Cambios pequeños pueden abrir posibilidades interesantes.
¡Guardas!.
<timestamp compact="0" offset="52" ts="4387">[01:13:07 ]<topic> Curiosidades encontradas esta semana:</topic></timestamp>
traceback.clear_frames(tb)
:
https://doc