Detalles internos de rendimiento de Python y exabruptos sobre asyncio https://podcast.jcea.es/python/14\n
Participantes:
\nJes\xfas Cea, email: jcea@jcea.es, twitter:\n @jcea, https://blog.jcea.es/,\n https://www.jcea.es/. Conectando desde Madrid.
\nEduardo Castro, email:\n info@ecdesign.es. Conectando desde A\n Guarda.
\nJavier, conectando desde Madrid.
\nV\xedctor Ram\xedrez, twitter: @virako,\n programador python y amante de vim, conectando desde Huelva.
\nJuan Carlos, conectando desde Bilbao.
\nAudio editado por Pablo G\xf3mez, twitter:\n@julebek.
\nLa m\xfasica de la entrada y la salida es "Lightning Bugs", de Jason\nShaw. Publicada en https://audionautix.com/ con licencia\n- Creative Commons Attribution 4.0 International\nLicense.
\n[01:32] Nuevas versiones: Python 3.10a4 y Numpy.
\n[01:57] Don\u2019t Use Recursion In Python Any More,Python Closure \u2014\n A Pythonic technique you must know
\nDon\u2019t Use Recursion In Python Any More,Python Closure \u2014 A\n Pythonic technique you must know:\n https://towardsdatascience.com/dont-use-recursion-in-python-any-more-918aad95094c.
\nHilo en la lista de correo de Python Madrid:\n https://lists.es.python.org/pipermail/madrid/2021-January/004838.html.
\nClosure:\n https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).
\n[10:02] \xbfQu\xe9 es ser "Pyth\xf3nico"?
\nTwisted da\xf1a el cerebro: https://twistedmatrix.com/trac/.
\nBlack: https://pypi.org/project/black/.
\nfrom __future__ import braces
.
[14:52] Python Ideas:
\n\n[16:52] \xbfComillas simples o comillas dobles? '
o "
.
[23:07] Tama\xf1o de columnas: \xbf80?, \xbf120?, \xbf132?
\n[31:02] Primar la legibilidad, no el rendimiento.
\nCuando tienes if ... else ...
, \xbfQu\xe9 caso pones primero?,\n \xbfel corto o el largo? \xbfPrimero la condici\xf3n normal?
Microoptimizaciones que complican la legibilidad sin\n ganancia de rendimiento que importe en realidad.
\n[41:57] En las variables locales, la longitud del nombre de una\n variable no impacta en el rendimiento.
\n[43:02] Curiosear el "bytecode"\n https://es.wikipedia.org/wiki/Bytecode que genera Python.
\nDispositivo de Duff:\n https://es.wikipedia.org/wiki/Dispositivo_de_Duff.
\nEl "bytecode" https://es.wikipedia.org/wiki/Bytecode que\n genera Python no est\xe1 nada optimizado. Es mejorable.
\n[46:22] Bytecode generado para a + a
:
>>> dis.dis(lambda a: a + a)\n 1 0 LOAD_FAST 0 (a)\n 2 LOAD_FAST 0 (a)\n 4 BINARY_ADD\n 6 RETURN_VALUE\n
\n\xa1Guardas!
\nS\xed se hacen algunas optimizaciones simples:
\n>>> dis.dis(lambda : 5 + 3)\n 1 0 LOAD_CONST 1 (8)\n 2 RETURN_VALUE\n
\n[50:12] Python deja su pila de evaluaci\xf3n vac\xeda al terminar de\n calcular una expresi\xf3n.
\nM\xe1quina virtual de registros en vez de m\xe1quina virtual\n orientada a pila.
\nMuchas operaciones redundantes:
\n>>> import dis\n>>> def suma(valores):\n... s=0\n... for i in valores:\n... s+=i\n... return s\n... \n>>> dis.dis(suma)\n 2 0 LOAD_CONST 1 (0)\n 2 STORE_FAST 1 (s)\n\n 3 4 LOAD_FAST 0 (valores)\n 6 GET_ITER\n >> 8 FOR_ITER 12 (to 22)\n 10 STORE_FAST 2 (i)\n\n 4 12 LOAD_FAST 1 (s)\n 14 LOAD_FAST 2 (i)\n 16 INPLACE_ADD\n 18 STORE_FAST 1 (s)\n 20 JUMP_ABSOLUTE 8\n\n 5 >> 22 LOAD_FAST 1 (s)\n 24 RETURN_VALUE\n
\n\xbfQu\xe9 ocurre a la hora de depurar o para gestionar\n excepciones?
\n[56:32] Que un hilo modifique variables de otro hilo.
\n\xa1Guardas!
\nNOTA DESDE EL FUTURO:
\nPython 3.9.5:\n https://docs.python.org/release/3.9.5/whatsnew/changelog.html.
\nTraceback objects allow accessing frame objects without\n triggering audit hooks:\n https://bugs.python.org/issue42800.
\n[58:37] Pens\xe1bais que las interioridades del int\xe9rprete de\n Python son aburridas, pero no...
\nLa complejidad debe estar en tu programa, no en el lenguaje\n o el int\xe9rprete.
\nCompiladores optimizadores. Python se est\xe1 quedando atr\xe1s.
\nHacer cach\xe9 al buscar atributos:
\nIssue1616125: Cached globals+builtins lookup optimization:\n https://bugs.python.org/issue1616125.
\nissue43452: Microoptimize PyType_Lookup for cache hits\n https://bugs.python.org/issue43452.
\nDetectar cambios en un diccionario, incluyendo\n diccionarios internos como locals
o __builtins__
:\n PEP 509 Add a private version to dict:\n https://www.python.org/dev/peps/pep-0509/.
[01:06:52] Huevos de pascua en Python:
\nfrom __future__ import braces
.
import antigravity
.
import this
.
import __hello__
.
[01:08:27] Usar pass
o ...
(ellipsis).
[01:09:22] El PEP 509 no es para hacer diccionarios inmutables.
\nEs algo interno para el API de C. No est\xe1 accesible desde\n Python.
\nCambios peque\xf1os pueden abrir posibilidades interesantes.\n \xa1Guardas!.
\n[01:13:07] Curiosidades encontradas esta semana:
\ntraceback.clear_frames(tb)
:\n https://docs.python.org/3/library/traceback.html#traceback.clear_frames.
Manipular frame.back
.
Que una funci\xf3n sepa si se le est\xe1 llamando de una forma\n s\xedncrona o as\xedncrona.
\n[01:17:02] Los problemas filos\xf3ficos que tiene Jes\xfas Cea con\n la programaci\xf3n as\xedncrona tal y como est\xe1 implementada en Python.
\nUna biblioteca debe decidir si es s\xedncrona o as\xedncrona y\n "contamina" todo tu c\xf3digo.
\nHacer corrutinas "de verdad":\n https://es.wikipedia.org/wiki/Corrutina.
\nPersistencia y programaci\xf3n as\xedncrona.
\nConcepto de "awaitable":\n https://docs.python.org/3/library/asyncio-task.html#awaitables.
\nfuture.result()
:\n https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.result.
[01:32:17] Es dif\xedcil plantear temas tan esot\xe9ricos sin una\n preparaci\xf3n formal de la charla o sin avisar con tiempo para\n que la gente se lo pueda ver con calma antes.
\n[01:33:32] Problemas con el control de carga de asyncio\n https://docs.python.org/3/library/asyncio.html.
\nVuelve a tratarse el tema de si la biblioteca est\xe1ndar debe\n crecer o adelgazar.
\nSeg\xfan Jes\xfas Cea, asyncio\n https://docs.python.org/3/library/asyncio.html es la peor\n opci\xf3n.
\nAlternativas a asyncio:
\nTrio: https://trio.readthedocs.io/en/stable/.\n Monkey patching:\n https://en.wikipedia.org/wiki/Monkey_patch.
\nLa dificultad de luchar con una biblioteca que est\xe1 inclu\xedda\n en la biblioteca est\xe1ndar.
\n[01:42:32] La programaci\xf3n as\xedncrona es \xfatil para muchas m\xe1s\n cosas adem\xe1s de para gestionar peticiones de la red.
\n[01:44:12] Mejor usar concurrent.futures
\n https://docs.python.org/3/library/concurrent.futures.html que\n threading
https://docs.python.org/3/library/threading.html\n directamente.
Transportar excepciones entre hilos.
\nControl de carga y paralelismo.
\n[01:45:42] Referencia al bug solucionado en la tertulia\n anterior: Issue35930: Raising an exception raised in a "future"\n instance will create reference cycles\n https://bugs.python.org/issue35930.
\nQueda por ultimar el detalle de c\xf3mo solucionar el problema\n exactamente y enviar el parche para que se integre\n oficialmente en Python.
\nJes\xfas Cea describe las dos opciones que est\xe1 barajando:\n weakrefs https://docs.python.org/3/library/weakref.html o\n try ... finally
.
[01:50:57] Ya hubo "flames" brutales con Guido cuando se\n introdujo el operador ternario en Python.
\n[01:55:02] Despedida.
\n[01:55:50] Final.
\n