Articles of python internals

Comportamiento inesperado de itertools.groupby

Este es el comportamiento observado: In [4]: x = itertools.groupby(range(10), lambda x: True) In [5]: y = next(x) In [6]: next(x) ————————————————————————— StopIteration Traceback (most recent call last) in () —-> 1 next(x) StopIteration: In [7]: y Out[7]: (True, ) In [8]: list(y[1]) Out[8]: [9] La salida esperada de la list(y[1]) es [0,1,2,3,4,5,6,7,8,9] ¿Que está […]

¿Dónde tiene sus valores una lista de Python?

Desde la perspectiva de la introspección, donde los valores de lista se encuentran en el objeto de clase. Si la lista de objetos es de clase en python: >>> a = [‘one’, ‘two’] >>> type(a) Así que se almacena en algún lugar de la clase, pero ¿dónde? Por ejemplo: si definimos una clase con valores: […]

python 2 vs python 3 rendimiento de random, particularmente `random.sample` y` random.shuffle`

El problema del rendimiento del módulo de python random, y en particular, random.sample y random.shuffle surgió en esta pregunta . En mi computadora, obtengo los siguientes resultados: > python -m timeit -s ‘import random’ ‘random.randint(0,1000)’ 1000000 loops, best of 3: 1.07 usec per loop > python3 -m timeit -s ‘import random’ ‘random.randint(0,1000)’ 1000000 loops, best […]

¿Por qué una definición de clase siempre produce el mismo código de bytes?

Di que lo hago #!/usr/bin/env python # encoding: utf-8 class A(object): pass Ahora lo desmonto: python -m dis test0.py 4 0 LOAD_CONST 0 (‘A’) 3 LOAD_NAME 0 (object) 6 BUILD_TUPLE 1 9 LOAD_CONST 1 () 12 MAKE_FUNCTION 0 15 CALL_FUNCTION 0 18 BUILD_CLASS 19 STORE_NAME 1 (A) 22 LOAD_CONST 2 (None) 25 RETURN_VALUE Ahora agrego […]

Complejidad de len () con respecto a conjuntos y listas

La complejidad de len() con respecto a conjuntos y listas es igualmente O (1). ¿Por qué lleva más tiempo procesar conjuntos? ~$ python -m timeit “a=[1,2,3,4,5,6,7,8,9,10];len(a)” 10000000 loops, best of 3: 0.168 usec per loop ~$ python -m timeit “a={1,2,3,4,5,6,7,8,9,10};len(a)” 1000000 loops, best of 3: 0.375 usec per loop ¿Está relacionado con el índice de […]

¿Cómo funciona la carga de módulos en CPython?

¿Cómo funciona la carga del módulo en CPython debajo del capó? Especialmente, ¿cómo funciona la carga dinámica de extensiones escritas en C? ¿Dónde puedo aprender sobre esto? Encuentro el código fuente en sí bastante abrumador. Puedo ver que trusty ‘ dlopen() y friends se usan en sistemas que lo admiten, pero sin una idea más […]

¿Por qué es repr (int) más rápido que str (int)?

Me pregunto por qué repr(int) es más rápido que str(int) . Con el siguiente fragmento de código: ROUNDS = 10000 def concat_strings_str(): return ”.join(map(str, range(ROUNDS))) def concat_strings_repr(): return ”.join(map(repr, range(ROUNDS))) %timeit concat_strings_str() %timeit concat_strings_repr() Obtengo estos tiempos (python 3.5.2, pero resultados muy similares con 2.7.12): 1.9 ms ± 17.9 µs per loop (mean ± std. […]

Función de bytecode de Python

Estoy tratando de entender cómo funciona el bytecode. a.func() es una llamada de función. El bytecode correspondiente es aproximadamente LOAD_GLOBAL a , LOAD_ATTR attr y luego CALL_FUNCTION con 0 argumentos. Esto está totalmente bien si a es un módulo. Pero si a es un objeto, tiene que pasar la instancia del objeto en sí. Como […]

¿Por qué las cadenas con formato literal son tan lentas en Python 3.6 alfa? (ahora fijado en 3.6 estable)

He descargado una comstackción alfa de Python 3.6 del repository de Python Github, y una de mis nuevas características favoritas es el formato de cadena literal. Se puede usar como tal: >>> x = 2 >>> f”x is {x}” “x is 2” Esto parece hacer lo mismo que usar la función de format en una […]

Set literal da un resultado diferente de la llamada a la función set.

¿Por qué la llamada a la función set borra los dupes, pero el análisis de un literal set no lo hace? >>> x = Decimal(‘0’) >>> y = complex(0,0) >>> set([0, x, y]) {0} >>> {0, x, y} {Decimal(‘0’), 0j} (Python 2.7.12. Posiblemente la misma causa raíz para esta pregunta similar)